Консультация № 111489
29.11.2007, 04:37
0.00 руб.
0 3 3
Здравствуйте! Возникла проблема при обновлении браузер (например, нажатем кнопки F5) происходит повтроный ввод информации в базу данных из формы, как этого избежать? Мой код приведем в приложении.

Приложение:
<?if ($_POST[‘vvod‘]==‘1‘) { if (!$_POST[‘email‘] || $_POST[‘email‘]=="" || strlen($_POST[‘email‘])>30) {$message=‘Вы не ввели email, любо ваш email более 30 знаков‘;} else { //Открываем соединение с базой mysql_connect("localhost", "root", "") or die ("Нет соединения с базой данных, обратитесь к администратору!"); mysql_select_db("patexexpert"); //Заносим инфу из формы в базу $as_email=addslashes($_POST[‘email‘]); $tr_email=trim($as_email); $query="INSERT INTO mail(id, email) VALUES (null, ‘$tr_email‘)"; $result=mysql_query($query); if (mysql_affected_rows()==1) {echo ‘Информация добавлена в базу данных‘; $noform_var=1;} else {error_log(mysql_error()); echo ‘Данные не внесены в базу, обратитесь к администратору!‘;} } }//Выводим форму во всех случаях, кроме тех, когда передача формы заверашается успешноif (!$noform_var) { $thisfile=$_SERVER[‘PHP_SELF‘]; $message.=‘<p>Введите свой мейл:</p> <form action="‘.$thisfile.‘" method="post"> <input name="email" type="text" size="25" /> <input name="q" type="text" size="12" value="‘.$_POST[‘q‘].‘" /> <input name="vvod" type="hidden" value="1" /> <input name="submit" type="submit" value="Submit" /> </form>‘; }?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /><title>Тест</title></head><body><? echo $message;?></body></html>

Обсуждение

Неизвестный
29.11.2007, 08:44
общий
это ответ
Здравствуйте, Mart!
Во-первых, можно индексировать записи в базе данных, дабы не появлялось одинаковых записей. Я говорю про присвоение какому-либо полю в таблице индекса INDEX или UNIQUE. Но это способ довольно ресурсоемкий. Кроме того, большинство людей вообще переписываются короткими и пошлыми фразами типа "привет как дела".
Другой способ - проставить в форме, которую Вы отправляете, атрибут action с несколько измененным значением - например, добавляйте в конец url результат работы функции time(). Например, таким образом(см. приложение, п. 1). Что с этим потом делать? Можно проверить что текущее значение, возвращаемое функцией time() равно значению переменной $_GET[‘rand‘] и делать запись в базу только в этом случае. Опасность есть и здесь. Время работы такой конструкции имеет порядок примерно 0.0001 с. Представим себе ситуацию, что форму мы отослали 29 ноября 2007 года в 4:37:<b style=color:#FF0000>43.99999</b>. Тогда форма может не быть принятой потому, что time() возвратит значение, отличное от значения переменной $_GET[‘rand‘]. Чем быстрее работает скрипт, тем ниже такая вероятность. Она и так, вообще-то, низкая, но она есть, хотя на первый взгляд и кажется абсурдной.
После того, как мы отослали форму, при нажатии кнопки F5 запрашиваемый url не изменится. Зато изменится значение time(), и форма не будет принята.

После того, как форма загружена, можно сделать перенаправление на исходную страницу путем посыла заголовка "Location: URL" функцией header. Но этот способ не сработает, если Вы уже что-то при этом в браузере вывели. Например, сообщение какое-то, да достаточно вывести один пробел, как этот способ уже не будет работать. Тогда можно применить JavaScript(см. п.2 приложения). Но и у этого способа есть крупный недостаток - некоторые "умные" пользователи отключают JavaScript.

Вот так-то. Удачи!

Приложение:
П. 1.<form method="POST" action="?rand=<?=time();?>">....</form>П. 2.<? echo "<script>location.href="URL";</script>";
Неизвестный
29.11.2007, 10:09
общий
это ответ
Здравствуйте, Mart!
Оба способа из предыдущего ответа аж просятся "склеить" их:
Сделайте в таблице поле "время добавления" с уникальным индексом и записывайте в него значение параметра rand.
Неизвестный
29.11.2007, 15:33
общий
это ответ
Здравствуйте, Mart!
У меня на форме стоит защита - капча, и при занесении данных в базу сесиия с капчей обнуляеться, при этом нажимая Ф5 пользователь видит - "Вы не верно ввели число с картинки".
Второе, чем я пользуюсь, является проверка всех или критических полей, на наличие дубликатов.

Приложение:
mysql_select_db("patexexpert"); // проверяем на дубликаты //Заносим инфу из формы в базу $query="SELECT * FROM mail WHERE email=‘$tr_email‘)"; // подсчитываешь количество записей и если 0 заносишь данные в базу (Надеюсь сам напишешь!) $as_email=addslashes($_POST[‘email‘]); $tr_email=trim($as_email); $query="INSERT INTO mail(id, email) VALUES (null, ‘$tr_email‘)";
Форма ответа