Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > ПОМОГИТЕ


Автор: GC 16.3.2003, 20:05
Помогите люди добрые!

Я пишу новостной скрипт.
Добовление новостей работает, а вот как заставить его изменять новость нинаю confused.gif
помогите пожалуйста!

заранее спасибо.


Автор: acp 16.3.2003, 21:38
Система основана на файлах?
Тогда:
1. Можно сделать для каждой новости твоей отдельный файл. При изменении новости считавать этот файл и перезаписывать его
2. А можно всё в один файл запихать. Новости разделять какими-нибудь символами типа "---". При изменении новости опять же перезаписывать весь файл.

PS: не совсем пойму в чём проблема...

Автор: GC 16.3.2003, 23:14
Да, acp система основана на файлах, новости храняться в одном .тхт файле.
проблема в том что когда перезаписываеться весь фаил то новости или удаляються или на все строки пишеться одна (та которая была изсменена).

дата:строка первая
дата:строка вторая
дата:строка третья

после редактирования допустем второй строки получаеться

дата:строка вторая
дата:строка вторая
дата:строка вторая

confused.gif

Автор: acp 16.3.2003, 23:50
Ну приведи кусок кода, который это реализует. Если он не большой. Неправильно просто у тебя что-то и всё...

Автор: Devorior 17.3.2003, 08:28
действительно, код напиши...у тебя наверное запись в файл неправильно идет

Автор: GC 17.3.2003, 08:35
<form method="POST" action="1.php">
<?
$fp = file("news.dat");
for ($i = 0; $i <= count($fp); $i++)
{
list($d_date,$n_news) = explode(":",$fp[$i]);
if(strlen($d_date) > 0)
{
$n_news = ereg_replace("<br>","\r\n",$n_news);

print "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"400\">
<tr>
<td colspan=\"2\"><input name=\"date\" type=\"text\" value=\"$d_date\" style=\"width: 300\"> номер: $i</td>
</tr>
<tr>
<td colspan=\"2\" align=\"center\"><textarea name=\"news\" rows=10 cols=20 style=\"width: 400\">$n_news</textarea></td>
</tr>
<tr>
<td colspan=\"2\" align=\"center\">&nbsp;</td>
</tr>
<tr>
<td width=\"200\" align=\"center\"><input type=\"submit\" value=\"изменить\" style=\"width: 100\" name=\"B\"></td>
<td width=\"200\" align=\"center\"><input type=\"submit\" value=\"удалить\" style=\"width: 100\" name=\"b\"></td>
</tr>
</table><br><br>\n";
}
}

if ($B == "изменить")
{
$editfile = fopen ("news.dat","w");
$news = ereg_replace("\r\n","<br>",$news);
fputs($editfile,"$date:$news\n");
fclose($editfile);
print "<script LANGUAGE=\"javascript\">window.location.href = \"1.php\"</SCRIPT>";
}
?>
</form>


формат записи в фаил такой: date:news




Автор: IZ@TOP 17.3.2003, 17:41
А че страдать то ? Я тож делаю новостную ленту на файлах, проще и удобней записывать - один файл одна новость, а название файла есть дата, там вроде 17.03.03 ... а изменять это проще простого ! Просто читаешь его весь и выводишь в форму, со всеми вытикающими от сюдого ...редактируешь, ну и отправляешь потом на сервер и файл перезаписывается !

Автор: Devorior 17.3.2003, 19:56
делай как Iz@top, потом легче будет

Автор: IZ@TOP 17.3.2003, 21:30
Devorior Спасиб smile.gif

Автор: y.s.grin 17.3.2003, 22:07
А я вот сделал так.

В одном файле тело новостное в виде двумерного массива. Там сколько хочешь можно характеристик сделать для новости(сама новость, дата, название новости, сопутствующая ссылка и так далее...)
А другой файл это всё дело просматривает

Автор: y.s.grin 17.3.2003, 22:09
И тело новостное изменяй хоть до посинения

Автор: Devorior 18.3.2003, 08:25
y.s.grin, а с базой еще круче можно сделать smile.gif

Автор: y.s.grin 18.3.2003, 15:15
2Devorior

ты прав. smile.gif

Автор: Foxx 19.3.2003, 00:27
Цитата(GC @ 17.3.2003, 00:35)
if ($B == "изменить")
{
$editfile = fopen ("news.dat","w");
$news = ereg_replace("\r\n","<br>",$news);
fputs($editfile,"$date:$news\n");
fclose($editfile);
}

if ($B == "изменить")
{
$news = ereg_replace("\r\n","<br>",$news);
$editfile = fopen ("news.dat","a+");
fputs($editfile,"$date:$news\n");
fclose($editfile);
}
Файл открывается в режиме записи и чтения, указатель устанавливается на последний байт, содержимое не уничтожается! Этот режим полезен если НУЖНО ЧТО_ЛИБО ДОПИСАТЬ В ФАЙЛ

Небольшое замечание. В качестве разделителя лучше не использовать двоеточие. Я обычно пользуюсь
"|" или "::". Таких символов точно нет в сообщении smile.gif

Автор: IZ@TOP 19.3.2003, 00:55
Foxx А как дописать в начало файла ? я пробовал с r+ но вот беда верхнея строчка убивалась ...

Автор: Foxx 19.3.2003, 01:18
r - файл открывается только для чтения. Если файл не существует - ошибка. После удачного открытия указатель устанавливается на первый байт, то есть на начало.
r+ - файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на первый байт. Если файл несуществует, фозвращается false. Если в момент записи указатель установлен где-то в середине файла, то данные записываются поверх существующих, а не раздвигают их.
w - cсоздаетс новый пустой файл. Если такой файл был - он уничтожается.
w+ - аналогичегн w. Но если файл не существовал, он создается. Можно работать в режиме чтение/запись. Изначальное содержимое удалаяется.
а - открывает файл в режиме записи. Указатель на последний байт. Содержимое не уничтожается. Если файла не существовало, он создается.
а+ - аналогичен а. Содержимое остается. режим чтения/запись. Если файла не существовало, он создается.

if ($B == "изменить")
{

$news = ereg_replace("\r\n","<br>",$news);
$data=file("news.dat"); // просто создаем массив с содержимым
$editfile = fopen ("news.dat","w+");
fputs($editfile,"$date:$news\n");
for($i=0; $i< sizeof($data); $i++)
{
fputs($editfile,"$data[$i]\n");
}
fclose($editfile);
}

кажется так. попробуй. если не получиться - скажи.

Автор: IZ@TOP 19.3.2003, 01:37
Цитата
r - файл открывается только для чтения. Если файл не существует - ошибка. После удачного открытия указатель устанавливается на первый байт, то есть на начало.
r+ - файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на первый байт. Если файл несуществует, фозвращается false. Если в момент записи указатель установлен где-то в середине файла, то данные записываются поверх существующих, а не раздвигают их.
w - cсоздаетс новый пустой файл. Если такой файл был - он уничтожается.
w+ - аналогичегн w. Но если файл не существовал, он создается. Можно работать в режиме чтение/запись. Изначальное содержимое удалаяется.
а - открывает файл в режиме записи. Указатель на последний байт. Содержимое не уничтожается. Если файла не существовало, он создается.
а+ - аналогичен а. Содержимое остается. режим чтения/запись. Если файла не существовало, он создается.


... совсем за дураков держишь !!! :-(

Автор: Foxx 19.3.2003, 01:42
то бишь ?
чем не нравится ?

Автор: Foxx 19.3.2003, 01:44
Команды я привел на всякий случай, вдруг понядобятся.

А пример с записью в начало я переделал из прошлого примера. Что-то не работает?

Автор: IZ@TOP 19.3.2003, 02:05
Цитата
то бишь ?
чем не нравится ?


Ну вообще это мне кажется все знают ... во всяком случае все это основы ...
ну ты конечно все прямо как по книге зарубил, у меня кажись дома книга лежит одна по РНР, так там все точка в точку ! smile.gif
Цитата
А пример с записью в начало я переделал из прошлого примера. Что-то не работает?

Работает или нет я не проверял, да и за чем ... я терь такие дела с БД делаю ...

А вот подскажи, мне интересно - вот если указатель на начало устанавливается на первый байт, однако все равно первая строка перезаписывается ... что мне каждый раз \n в начале записи вводить ..

Автор: GodCries 19.3.2003, 02:38
спасибо

Автор: GodCries 19.3.2003, 03:02
Fox...

твоя подсказка:

if ($b == "изменить")
{
$news = ereg_replace("\r\n","<br>",$news);
$file=file("news.dat");
$editfile = fopen ("news.dat","w");
fputs($editfile,"$date:$news\n");
for($i=0; $i< sizeof($file); $i++)
{
fputs($editfile,$file[$i]);
}
fclose($editfile);
}


делает следующее:

строка 1
строка 2
строка 3

изменяю строка 3 на строка 33

получаеться:

строка 33
строка 1
строка 2
строка 3

он как бы добавляет

Автор: Foxx 19.3.2003, 13:10
Цитата(Iz @ 18.3.2003, 21:05)
Ну вообще это мне кажется все знают ... во всяком случае все это основы ...
ну ты конечно все прямо как по книге зарубил, у меня кажись дома книга лежит одна по РНР, так там все точка в точку ! smile.gif

А вот подскажи, мне интересно - вот если указатель на начало устанавливается на первый байт, однако все равно первая строка перезаписывается ... что мне каждый раз \n в начале записи вводить ..

ГЫ.... я иногда забываю smile.gif Но это не с книжки, а сборная солянка.

Ну да. только лучше не \n, а \r\n - как в *них системах.

Автор: Foxx 19.3.2003, 13:12
Цитата(GodCries @ 18.3.2003, 22:02)
if ($b == "изменить")
{
$news = ereg_replace("\r\n","<br>",$news);
$file=file("news.dat");
$editfile = fopen ("news.dat","w");
fputs($editfile,"$date:$news\n");
for($i=0; $i< sizeof($file); $i++)
{
fputs($editfile,$file[$i]);
}
fclose($editfile);
}
делает следующее:

строка 1
строка 2
строка 3

изменяю строка 3 на строка 33

получаеться:

строка 33
строка 1
строка 2
строка 3

он как бы добавляет


Я это и делал. Чтобы изменить строчку нужно знать ее номер - передавая например через скрытое поле. Что-то типа того:
if ($b == "изменить")
{
$news = ereg_replace("\r\n","<br>",$news);
$file=file("news.dat");
$editfile = fopen ("news.dat","w");
for($i=0; $i< sizeof($file); $i++)
{
if($i!=$number)
{
fputs($editfile,$file[$i]);
}
if($i==$number)
{
fputs($editfile,"$date:$news\n");
}
}
fclose($editfile);
}

$number - это номер перезаписываемой строки. По крайней мере я у себя сделал так. cool.gif

Автор: IZ@TOP 19.3.2003, 17:39
Цитата
Ну да. только лучше не \n, а \r\n - как в *них системах.


Это у меня тож гдето в книжке есть ... biggrin.gif

Автор: Foxx 19.3.2003, 20:33
Цитата(Iz @ 19.3.2003, 12:39)
Это у меня тож гдето в книжке есть ... biggrin.gif

А я не знаю есть или нет. У меня инет на работе а книжка дома. Так что пишу по памяти и по поиску, по форумам..... что задерживается в голове то и выводиться smile.gif

А код то работает? Его я со своей гостевухи снял, так что проблем не должно быть.

Автор: IZ@TOP 19.3.2003, 21:51
Цитата
А код то работает? Его я со своей гостевухи снял, так что проблем не должно быть.

Думаю что работает (я не проверял, кстати я это давно тож для гуесты хотел использовать)
Цитата
А я не знаю есть или нет. У меня инет на работе а книжка дома. Так что пишу по памяти и по поиску, по форумам..... что задерживается в голове то и выводиться


У меня кстати тоже книжка дома а в нет я на работе вылазю ... так что я не мухлюю и в книги не заглядываю (иначеб меня на работе начальство с потрохами сожрало !)!!!

Автор: Foxx 19.3.2003, 21:58
пользуйся, мне не жалко smile.gif

у меня с работой полегче, халявный инет и уйма времени.... токо желания иногда не хватает sad.gif да и идеи быстро заканчиваются

Автор: IZ@TOP 19.3.2003, 22:11
Цитата
у меня с работой полегче, халявный инет и уйма времени.... токо желания иногда не хватает  да и идеи быстро заканчиваются

Везет ... а у меня идей пруд пруди а времени тока по выходным и вечером после работы, и то, в выходные куданить друзья утаскивают а вечером хочется ото всего отдохнуть ...

Автор: Foxx 19.3.2003, 22:20
Цитата
Везет ... а у меня идей пруд пруди

Поделишься? МОжет я даже чем-т осмогу помочь ?smile.gif))

Цитата
а времени тока по выходным и вечером после работы, и то, в выходные куданить друзья утаскивают а вечером хочется ото всего отдохнуть ...

у меня выходные пропадают sad.gif так что урываю время между учебой и работой.


Автор: arial 9.4.2003, 20:23
Во-первых (Если файл читается в массив):
Записываем новости в конец файла, читаем файл в массив, а затем (перед отображением) массив переворачиваем задом на перед (array_reverse(array)). Получается, что было последним - станет первым.
Или в цикле делать так:
for($i=count($array); $i>=0; $i--) {
echo $array[$i];
}

Во-вторых (если require(news.txt);):
Для записи новости в верх файла:
Читаем файл в переменную $старость. Записываем в начало этого файла новость:
$editfile = fopen ("news.txt","w");
fputs($editfile,"$новость\n");
fclose($editfile);
А уже после этого дописываем в конец файла старые новости (старости):
$editfile = fopen ("news.txt","r");
fputs($editfile,"$старость");
fclose($editfile);

Но, со вторым способом была у меня проблема:
Старости считались в переменную, файл открыт для записи в начало, но новость еще не записалась, произошел какой-то сбой и у меня остался пустой файл...
Так что после этого я использую только первый способ. cool.gif

Автор: arial 10.4.2003, 12:21
Цитата(arial @ 9.4.2003, 12:23)
$editfile = fopen ("news.txt","r");
fputs($editfile,"$старость");
fclose($editfile);


Извините, там не "r" а "a" надо писать. Заклинило... confused.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)