PDA

Показать полную графическую версию : [решено] PHP | Обнуление массива $_POST при обновлении


delog
22-03-2009, 20:29
Текстовое поле + кнопка "отправить". После отправления сообщение записывается в файл. Если нажать кнопку "обновить" в браузере, то сообщение записывается опять! Как сделать, чтобы оно записывалось только при нажатии на кнопку "отправить"? Вот пример, на всякий случай:
<?php
if(!empty($_POST['comment'])){
$fh= fopen("guestbook.txt","a");
fputs($fh,$_POST['comment']."\n");
fclose($fh);
}
$fh= @fopen("guestbook.txt","r");
if($fh){
while(!feof($fh)){
$line= fgets($fh);
echo $line."<hr/>\n";
}
fclose($fh);
}
?>

Coutty
22-03-2009, 20:37
Перед добавлением коммента в файл выполняйте поиск. Если есть совпадение - значит игнорировать.

delog
22-03-2009, 22:28
Это общепринятое решение? Похоже на костыль... А если я два раза нажму на кнопку "отправить", то, по идее, должно добавиться два коммента, но добавится только один. Ну может с комментариями этот подход и оправдан, а если я таким образом добавляю какие-нибудь очки(карму)? Как сделать, чтобы очки добавлялись только при нажатии на кнопку, но не при обновлении страницы?

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

Coutty
23-03-2009, 04:03
Ну если хотите "правильный подход", то начните с того, что гостевая книга использует базу данных с сохранением IP отправителя и времени отправки сообщения (прошло меньше 30 секунд от предыдущего сообщения - с добавлением нового отказать. Антифлуд-система). Также можно добавить скрытое поле с каким-нибудь md5-хэшем от системного времени, которое включается в БД в качестве ключа: ключ найден - добавлять не будем. С "кармой" аналогично. Вам в любом случае придётся записывать "кто, кому, за что" во избежание накрутки счётчика. Кроме того, подобные рейтинговые системы реализуются на AJAX для удобства пользователей, а значит никакие обновления страниц не помогут (но могут помочь повторные клики, поэтому в БД и записываем кучу информации).

А вот чтобы $_POST при обновлении обнулять - это вам, видимо, браузеры переписывать надо.

Artem-Samsung
23-03-2009, 04:38
Coutty, +1, видать задело : ))
delog, в вашем примере первое сообщение можно считать общепринятым. Ведь иногда куда сложнее в программе составить условие и разные "защиты от дурка", чем сам алгоритм выполняемой части программы.

Предложу еще свой метод

Предположим, у нас есть форма в файле 1.html

<form action="2.php" method="post" name="delog">
<input name="comment" type="text" />
<input name="button" type="submit" />
</form>


В файле 2.php выполняется скрипт:

<?php
if(!empty($_POST['comment'])){
$fh= fopen("guestbook.txt","a");
fputs($fh,$_POST['comment']."\n");
fclose($fh);
}
$fh= @fopen("guestbook.txt","r");
if($fh){
while(!feof($fh)){
$line= fgets($fh);
echo $line."<hr/>\n";
}
fclose($fh);
}
?>

В этом же файле со скриптом вставляем ява скрипт автоматической переадресовки.

<script language="JavaScript">
window.location.href = "1.html"
</script>

И вот вы опять почти незаметно в первой форме и обновляйте сколько желаете.

В этом весь фокус. Этот метод используется на многих форумах, при отправлении сообщения.

Coutty, правильный ход мысли?

delog
23-03-2009, 10:58
Спасибо, пример с ява-скриптом - то, что надо. Только вывод на экран надо затолкать в 1.html(php), а в 2.php оставить запись в файл.

А вот чтобы $_POST при обновлении обнулять - это вам, видимо, браузеры переписывать надо.
Да, на счет обнуления POST'a я сглупил. Сейчас подумал, а ведь GET в адресной строке мне никто не даст изменить, можно было догадаться, что и POST тоже.




© OSzone.net 2001-2012