Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Защита от многократной отправки одной и той же формы
 
 автор: olelef   (23.10.2007 в 23:19)   письмо автору
 
 

Доброго времени суток. Вопрос такой: необходимо помешать пользователям отправлять одну и ту же форму несколько раз, например пользователь ошибочно (а может и намеренно) щелкнул вместо одного, два раза по кнопке submit? .... О моей форме: данные сохраняются в базе данных, для вывода формы и обработки введенных в ней данных используется одна и та же страница.Заранее спасибо.

   
 
 автор: DIM@   (24.10.2007 в 00:03)   письмо автору
 
   для: olelef   (23.10.2007 в 23:19)
 

Я делал следующим образом
Вот форма,
не обращайте внимания на неточности, это из рабочего кода, где многое строилось из базы, но смысл не меняется:


<form action="question.php?action=save" method="post" name="QNew">
 <table cellspacing="1" cellpadding="1" width="100%" align="center" border="0">
  <tr>
   <td valign="top" align="right" width="200" bgcolor="#ccffcc"><div id="resultQCel">Цель:&nbsp;&nbsp;</div></td>
   <td bgcolor="#f4f4f4"><SELECT><Option>1</Option></SELECT></td>
  </tr>
  <tr>
   <td valign="top" align="right" bgcolor="#ccffcc"><div id="resultQText">Содержание:&nbsp;&nbsp;</div></td>
   <td bgcolor="#f4f4f4"><textarea id="QText" name="QText" rows=8 cols=20 wrap="on" style="width:100%"></textarea></td>
  </tr>
  <tr>
   <td valign="top" align="right" bgcolor="#ccffcc" colspan=2><input type="button" name="QSend" value="Отправить" onClick="QuestionFerify()"></td>
  </tr>
 </table>
</form>


А вот JavaScript, у которого 2 назначение:
1. Проверить форму на заполнение помечая не заполненые поля.
2. Отправить форму при заполнении.


<script type="text/javascript" language="JavaScript">
function QuestionFerify() {
 QCel=document.getElementById('QCel').value;
 QText=document.getElementById('QText').value;
 err=0;
 if(QCel<1){
  err=1;
  document.getElementById('resultQCel').innerHTML = "<font style='font-weight: bolder; color: #FF0000;'>Цель*:&nbsp;&nbsp;</font>";
 }else{
  document.getElementById('resultQCel').innerHTML = "<font style='bolder; color: #000000;'>Цель*:&nbsp;&nbsp;</font>";
 }
 if(QText.length<10){
  err=1;
  document.getElementById('resultQText').innerHTML = "<font style='font-weight: bolder; color: #FF0000;'>Содержание*:&nbsp;&nbsp;</font>";
 }else{
  document.getElementById('resultQText').innerHTML = "<font style='bolder; color: #000000;'>Содержание*:&nbsp;&nbsp;</font>";
 }
 if(err==0){
 document.getElementById('QSend').enabled=false
 document.forms('QNew').submit();
 }
}
</script>


После отправки формы JavaScript проверяет форму на заполнение и при правильном заполнении отправляет ее скрипту, перед этим блокируя кнопку Submit

   
 
 автор: lifead   (24.10.2007 в 06:18)   письмо автору
 
   для: olelef   (23.10.2007 в 23:19)
 

Можно сделать следующее

например файл index.html
<form action="здес_обработчика_в_другом_файле " method="post" name="QNew" >
<!-- Здесь содержание саймой формы-->
</form>
а вот обработчик
<?php
// здесь обрабатываем
//а в конце обработчика пишем следующую "фразу"
header('адрес_файла_где_лежит_форма');
?>

   
 
 автор: KPETuH   (24.10.2007 в 07:37)   письмо автору
 
   для: olelef   (23.10.2007 в 23:19)
 

самое нормальное решения которое я нашел это исползовать exit после обработки данных формы...


exit('<HTML><HEAD><META HTTP-EQUIV="REFRESH" CONTENT="0; URL='.$_SERVER['HTTP_REFERER'].'"></HEAD><BODY></BODY></HTML>');

   
 
 автор: lifead   (24.10.2007 в 08:02)   письмо автору
 
   для: KPETuH   (24.10.2007 в 07:37)
 

KPETuH, а вы можете объяснить как это работает.

   
 
 автор: KPETuH   (24.10.2007 в 08:27)   письмо автору
 
   для: lifead   (24.10.2007 в 08:02)
 

после успешной обработки формы, срабатывает exit который останавливает работу скрипта, а строка внутри exit делает перенаправление на страницу где находиться форма... при этом повторно данные просто не могут отослаться...

   
 
 автор: bronenos   (24.10.2007 в 14:39)   письмо автору
 
   для: KPETuH   (24.10.2007 в 08:27)
 

F5

   
 
 автор: KPETuH   (24.10.2007 в 14:56)   письмо автору
 
   для: bronenos   (24.10.2007 в 14:39)
 

ну проверь... у меня на ф5 не пашет :)

   
 
 автор: olelef   (24.10.2007 в 22:06)   письмо автору
 
   для: olelef   (23.10.2007 в 23:19)
 

Спасибо всем, нашел и сделал у себя такое решение проблемки:
1. В скрытом поле формы генерируем уникальный идентификатор:
 $uniqid = md5(uniqid(microtime(),1)); 
ну и сохраняем его в базе данных вместе с другими данными формы.
2. Перед обработкой формы надо проверять, есть ли уже этот идентификатор в базе данных. Если его нет, то все нормально, добавляем новую запись в базе данных, если идентификатор уже есть, то генерируем ошибку (или ничего не делаем)!

   
 
 автор: Eugene77   (25.10.2007 в 09:52)   письмо автору
 
   для: olelef   (24.10.2007 в 22:06)
 

>Спасибо всем, нашел и сделал у себя такое решение проблемки:
>1. В скрытом поле формы генерируем уникальный идентификатор:
>
 $uniqid = md5(uniqid(microtime(),1)); 
ну и сохраняем его в базе данных вместе с другими данными формы.
>2. Перед обработкой формы надо проверять, есть ли уже этот идентификатор в базе данных. Если его нет, то все нормально, добавляем новую запись в базе данных, если идентификатор уже есть, то генерируем ошибку (или ничего не делаем)!

Можно и так, но не советую.
Бывает вдруг вспоминаешь, что что-то упустил,
и хочешь вдогонку послать сообщение уже другое.

Поэтому лучше использовать

crc32(substr($_POST['post_just_received'], 0, 20))


Тогда и удобно, и лишнего по-случайности не пошлют.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования