Перезапись, удаление данных с файла.

Yuriy_S

-=PHP-Club=-
Перезапись, удаление данных с файла.

В общем сделал я наконец то гостевую! Все отлично работает, записывается. Делаю теперь страничку для редактирования данных, но не получается, вот каак она выглядит:
PHP:
<?
$file = "news.txt";
$fh = fopen($file, "r");
while (! feof($fh)) :
$fg = fgets($fh, 4096);
list($name, $email, $messg) = explode("|", $fg);
print "<form method=\"post\" action=\"edit.php\"><input type=\"text\" value=\"$name\" size=\"50\"><input type=\"text\" value=\"$email\" size=\"50\"><textarea name=\"rep\" rows=\"7\" cols=\"50\">$messg</textarea><input type=\"submit\" value=\"ok\"></form>";
$messg=eregi_replace("\n","<br>",$messg);
$fh1 = fopen($file, "w+");
$fwr = fwrite($fh1, $name);
fclose($fh);
endwhile;
?>
Когда я открываю этот скрипт, то он зацикливается и..... много много появляется форм. В формах данные выведены. Но вот как, как сделать что бы можно было изменять записи через туже форму, нажав кнопку все было ок! ?
Пожалуйсто приведите примерчик, или подправьте этот скрипт.
Жду и надеюсь на вас!
 

tony2001

TeaM PHPClub
н-и-ч-е-г-о не понял.
попробуй еще раз, пошагово, объяснить проблему.
 

Апокалипсис

Guest
Re: Перезапись, удаление данных с файла.

А ты вкурсе что лучше каждой мессаги пори записи в файл присваивать уникальный ID номер,сделать можно так:
PHP:
$pid=count(file($file));
$newid=$pid+1;

Тогда у тебя не будет "зацикливатся" вывод:
PHP:
$file = "news.txt"; 
$fh = fopen($file, "r"); 
while (! feof($fh)) : 
$fg = fgets($fh, 4096); 
list($mid,$name, $email, $messg) = explode("|", ...
if($id=$mid){
print...
Так у тебя будет редактироваться какой нибудь конкретный пост, а не все как у тебя...
 

.des.

Поставил пиво кому надо ;-)
Этот скрипт нельзя поправить его надо переписать.
Переписать спокойно!
ошибок куча, алгоритм не ясен.
Попробуй себе сначала на простом человеческом (предположительно русском) языке рассказать что ты хочешь сделать. ПОтом разбить на шаги.
Почему выводится много форм понимаешь? ты же в цикл поместил вывод форм.
Еще fopen ты делаешь до цикла а fclose в цикле.. получается что файл у тебя откроется и на первой же итерации закроется.
далее ты в одном скрипте прочитал данные потом что -то из них пытаешься записать (почему то только $name).

Попробуй подумать в таком направлении... скрипту для редактирования ты передаешь номер сообщения для редактирования.
он открывает файл,
читает его весь
функцией explode все преобразуешь в массив
перемещаешься по смещению к нужной записи. читаешь ее.
выводишь в поля формы.
когда форма отредактирована, пользователь нажал сабмит
устанавливается какой нибудь флаг redact=1 допустим.
и ты снова читаешь свой файл затем записываешь в него все сообщения до отредактированного без изменения, затем отредактироваронное, потом все остальные.
как, открывать, читать, писать в файл, читай в мануале.
fgets тебе здесь не нужен. используй file()
 

Yuriy_S

-=PHP-Club=-
Дак это же форум для чайников!!!
Я чайник, поэтому прошу что бы мне помогли, напривер, привели небольшой примерчик, который бы редактировал, а вот если не знаете, то и не пишите все подряд.
Как написал des, я понимаю что я сделал ошибок кучу и что нада переписать, но как, вот в этом то вопрос, мне помошь нужна а не советы.
 

.des.

Поставил пиво кому надо ;-)
Yuriy если я напишу для тебя скрипт, то ты не поймешь ничего. давай так ты начнешь писать по схеме приведенной мной, а возникнут конкретные вопросы задавай в этом же треде.
 

Yuriy_S

-=PHP-Club=-
Ну на счет ничего не пойму это вряд ли, а вот то что я сам начал делать, и чтоо получилось:
я вынес форму из цикла и переменные $name, $email, $messg - не действуют за циклом. То есть форма не отображает данные. Fgets здесь может и не нужен, но нужно здесь fwite, и file() тоже не нужен. В общем не видать мне никогда своей гостевой с возможностью администрирования. :(((((((((((((
 

Yuriy_S

-=PHP-Club=-
так все таки, мне кто нибудь поможет?
Как мне присвоить то id к каждой строке, которая состоит из нескольких элементов.
я пользуюсь функцией explode. В общем напишите привер присваивания плиз.
И кстати%2
 

Yuriy_S

-=PHP-Club=-
так все таки, мне кто нибудь поможет?
Как мне присвоить то id к каждой строке, которая состоит из нескольких элементов.
я пользуюсь функцией explode. В общем напишите привер присваивания плиз.
И кстати, я сделал так что бы выводилось в формы сожержимое файла, так же при помощи explode просвоил элементам переменные, и вывел каждую их в соотв. формы.
Но! формы находятся у меня в цикле while. И формы выводятся всегда на 1 больше в конце страницы как бы копиия всех форм но без данных.
И вообще, как все будет записываться в файл, то что я отредактирую в формах, для этого нужен id? Напишите поподробнее.
 

Апокалипсис

Guest
Автор оригинала: Yuriy_S
так все таки, мне кто нибудь поможет?
Как мне присвоить то id к каждой строке, которая состоит из нескольких элементов.
Я тебе ответил, при записи в гостевую книгу делай так

$preid=count(file($file));
$newid=$preid+1;//Вот тебе новое #ID для каждой мессаги
потом пишешь в файл:

$message .="$newid|$name|$eml|$msg|\n";
далее это пишешь в файл, теперь у тебя в файле есть строка(и), которые имееют уникальный ID.
 

Yuriy_S

-=PHP-Club=-
Вот, сделал я ID, теперь у меня в файле с данными самый первый стоит ID, 1,2,3 ...... А как мне теперь обратиться то к нему? что бы к приверу вывести конкретную строку. И так же, покажите плиз, как в моем примере можно обратиться к какому нибдуь конкретному элементу?
например: 1|Yuriy|[email protected]|Hello, test| - так выглядит строка в файле. И мне нужно например обратиться к последнему элементу, как это сделать?
И возможно ли перезаписывать(редактировать) или удалять каакую-нибудь конкретную строку?
 

Unregister

Guest
Автор оригинала: Апокалипсис
Я тебе ответил, при записи в гостевую книгу делай так

$preid=count(file($file));
$newid=$preid+1;//Вот тебе новое #ID для каждой мессаги
потом пишешь в файл:

$message .="$newid|$name|$eml|$msg|\n";
далее это пишешь в файл, теперь у тебя в файле есть строка(и), которые имееют уникальный ID.
Угу, а если он добавит возможность удалять сообщения, то по твоему алгоритму у него будут плодиться мессаги с одинаковыми айдишниками.
 

Апокалипсис

Guest
Автор оригинала: Unregister
Угу, а если он добавит возможность удалять сообщения, то по твоему алгоритму у него будут плодиться мессаги с одинаковыми айдишниками.
тогда так:
PHP:
list($id,$name,...
$newid=$id+1

//Новое ID
2 Yuriy_S

Обращатся к мессаги по ID так:
list($id,...
if($p_id==$id){

echo...
где $p_id - это известный тебе id мессаги
 

Yuriy_S

-=PHP-Club=-
echo...
где $p_id - это известный тебе id мессаги!!!
echo...???? И что выводить по каждому элементу?
Можно как нибудь сразу вывести строку по id номеру?
И если я напишу echo $id, $name, $email.....т.д, то он же выведет мне со всех строк, а как что бы только ту которая нужна?
 

RomikChef

Guest
смотри.
[m]file[/m] - супер команда. Она считывает файл в массив.
теперь тебе достаточно пробежать в цикле по этому массиву, найти запись с нужным id и отредактировать. Затем заменить строку массива, сделать массиву join и записать в файл!
 

Апокалипсис

Guest
Автор оригинала: Yuriy_S
echo...
где $p_id - это известный тебе id мессаги!!!
echo...???? И что выводить по каждому элементу?
Можно как нибудь сразу вывести строку по id номеру?
И если я напишу echo $id, $name, $email.....т.д, то он же выведет мне со всех строк, а как что бы только ту которая нужна?
Привожу,подробный пример:
PHP:
$data=file($file);//Преобразуешь файл в массив
for($i=0;$i<=count($data);$i++){

list($id,$name,$eml,$text)=explode("|",$data[$i]);
//Теперь получай нужную тебе мессагу по ID
if($p_id==$id){
echo"$name $eml $text // Тут и будет нужная тебе мессага,если $p_id правильно задано!
 

Yuriy_S

-=PHP-Club=-
хм... сделал я так, приходится в ручную подставлять значения
$p_id ... В общем все выводится, конкретная строка.
И чего я не пойму, так это сам процесс редактирования, удаления, когда я пишу скрипт для редактирования, то он либо дописывает в конец файла просто новые значения, либо вообще ничего не записывает.
писал я нечто вроде
PHP:
 $fp = fopen($file, "a")
$fwr = fwrite($fp, $name);   //где $name - редактированное имя.
 
Сверху