| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > ПОМОГИТЕ |
| Автор: GC 16.3.2003, 20:05 |
| Помогите люди добрые! Я пишу новостной скрипт. Добовление новостей работает, а вот как заставить его изменять новость нинаю помогите пожалуйста! заранее спасибо. |
| Автор: acp 16.3.2003, 21:38 |
| Система основана на файлах? Тогда: 1. Можно сделать для каждой новости твоей отдельный файл. При изменении новости считавать этот файл и перезаписывать его 2. А можно всё в один файл запихать. Новости разделять какими-нибудь символами типа "---". При изменении новости опять же перезаписывать весь файл. PS: не совсем пойму в чём проблема... |
| Автор: GC 16.3.2003, 23:14 |
| Да, acp система основана на файлах, новости храняться в одном .тхт файле. проблема в том что когда перезаписываеться весь фаил то новости или удаляються или на все строки пишеться одна (та которая была изсменена). дата:строка первая дата:строка вторая дата:строка третья после редактирования допустем второй строки получаеться дата:строка вторая дата:строка вторая дата:строка вторая |
| Автор: 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\"> </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 Спасиб |
| Автор: 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, а с базой еще круче можно сделать |
| Автор: y.s.grin 18.3.2003, 15:15 |
| 2Devorior ты прав. |
| Автор: Foxx 19.3.2003, 00:27 | ||
if ($B == "изменить") { $news = ereg_replace("\r\n","<br>",$news); $editfile = fopen ("news.dat","a+"); fputs($editfile,"$date:$news\n"); fclose($editfile); } Файл открывается в режиме записи и чтения, указатель устанавливается на последний байт, содержимое не уничтожается! Этот режим полезен если НУЖНО ЧТО_ЛИБО ДОПИСАТЬ В ФАЙЛ Небольшое замечание. В качестве разделителя лучше не использовать двоеточие. Я обычно пользуюсь "|" или "::". Таких символов точно нет в сообщении |
| Автор: 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 | ||
... совсем за дураков держишь !!! :-( |
| Автор: Foxx 19.3.2003, 01:42 |
| то бишь ? чем не нравится ? |
| Автор: Foxx 19.3.2003, 01:44 |
| Команды я привел на всякий случай, вдруг понядобятся. А пример с записью в начало я переделал из прошлого примера. Что-то не работает? |
| Автор: IZ@TOP 19.3.2003, 02:05 | ||||
Ну вообще это мне кажется все знают ... во всяком случае все это основы ... ну ты конечно все прямо как по книге зарубил, у меня кажись дома книга лежит одна по РНР, так там все точка в точку !
Работает или нет я не проверял, да и за чем ... я терь такие дела с БД делаю ... А вот подскажи, мне интересно - вот если указатель на начало устанавливается на первый байт, однако все равно первая строка перезаписывается ... что мне каждый раз \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 | ||
ГЫ.... я иногда забываю Ну да. только лучше не \n, а \r\n - как в *них системах. |
| Автор: Foxx 19.3.2003, 13:12 | ||
Я это и делал. Чтобы изменить строчку нужно знать ее номер - передавая например через скрытое поле. Что-то типа того: 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 - это номер перезаписываемой строки. По крайней мере я у себя сделал так. |
| Автор: IZ@TOP 19.3.2003, 17:39 | ||
Это у меня тож гдето в книжке есть ... |
| Автор: Foxx 19.3.2003, 20:33 | ||
А я не знаю есть или нет. У меня инет на работе а книжка дома. Так что пишу по памяти и по поиску, по форумам..... что задерживается в голове то и выводиться А код то работает? Его я со своей гостевухи снял, так что проблем не должно быть. |
| Автор: IZ@TOP 19.3.2003, 21:51 | ||||
Думаю что работает (я не проверял, кстати я это давно тож для гуесты хотел использовать)
У меня кстати тоже книжка дома а в нет я на работе вылазю ... так что я не мухлюю и в книги не заглядываю (иначеб меня на работе начальство с потрохами сожрало !)!!! |
| Автор: Foxx 19.3.2003, 21:58 |
| пользуйся, мне не жалко у меня с работой полегче, халявный инет и уйма времени.... токо желания иногда не хватает |
| Автор: IZ@TOP 19.3.2003, 22:11 | ||
Везет ... а у меня идей пруд пруди а времени тока по выходным и вечером после работы, и то, в выходные куданить друзья утаскивают а вечером хочется ото всего отдохнуть ... |
| Автор: Foxx 19.3.2003, 22:20 | ||||
Поделишься? МОжет я даже чем-т осмогу помочь ?
у меня выходные пропадают |
| Автор: 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); Но, со вторым способом была у меня проблема: Старости считались в переменную, файл открыт для записи в начало, но новость еще не записалась, произошел какой-то сбой и у меня остался пустой файл... Так что после этого я использую только первый способ. |
| Автор: arial 10.4.2003, 12:21 | ||
Извините, там не "r" а "a" надо писать. Заклинило... |