Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] PHP | Обнуление массива $_POST при обновлении (http://forum.oszone.net/showthread.php?t=135497)

delog 22-03-2009 20:29 1071249

PHP | Обнуление массива $_POST при обновлении
 
Текстовое поле + кнопка "отправить". После отправления сообщение записывается в файл. Если нажать кнопку "обновить" в браузере, то сообщение записывается опять! Как сделать, чтобы оно записывалось только при нажатии на кнопку "отправить"? Вот пример, на всякий случай:
PHP код:

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


Coutty 22-03-2009 20:37 1071255

Перед добавлением коммента в файл выполняйте поиск. Если есть совпадение - значит игнорировать.

delog 22-03-2009 22:28 1071356

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

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

Coutty 23-03-2009 04:03 1071530

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

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

Artem-Samsung 23-03-2009 04:38 1071574

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

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

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

PHP код:

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

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

PHP код:

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

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

Код:

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

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

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

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

delog 23-03-2009 10:58 1071783

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

Цитата:

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


Время: 08:55.

Время: 08:55.
© OSzone.net 2001-