Показать полную графическую версию : [решено] PHP | Обнуление массива $_POST при обновлении
Текстовое поле + кнопка "отправить". После отправления сообщение записывается в файл. Если нажать кнопку "обновить" в браузере, то сообщение записывается опять! Как сделать, чтобы оно записывалось только при нажатии на кнопку "отправить"? Вот пример, на всякий случай:
<?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);
}
?>
Перед добавлением коммента в файл выполняйте поиск. Если есть совпадение - значит игнорировать.
Это общепринятое решение? Похоже на костыль... А если я два раза нажму на кнопку "отправить", то, по идее, должно добавиться два коммента, но добавится только один. Ну может с комментариями этот подход и оправдан, а если я таким образом добавляю какие-нибудь очки(карму)? Как сделать, чтобы очки добавлялись только при нажатии на кнопку, но не при обновлении страницы?
Хочу добавить, что мне нужно, не чтобы "и так пойдет", а чтобы "истина восторжествовала", я ведь пока только учусь, хотелось бы сразу уяснить правильный подход к решению тривиальных задач.
Ну если хотите "правильный подход", то начните с того, что гостевая книга использует базу данных с сохранением 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, правильный ход мысли?
Спасибо, пример с ява-скриптом - то, что надо. Только вывод на экран надо затолкать в 1.html(php), а в 2.php оставить запись в файл.
А вот чтобы $_POST при обновлении обнулять - это вам, видимо, браузеры переписывать надо.
Да, на счет обнуления POST'a я сглупил. Сейчас подумал, а ведь GET в адресной строке мне никто не даст изменить, можно было догадаться, что и POST тоже.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC