Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Повторная отправка данных из формы
Покинул форум
Сообщений всего: 4
Дата рег-ции: Июнь 2007
Помог: 0 раз(а)
При обновлении браузера (например, клавишей 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>
Snic
Отправлено: 29 Ноября, 2007 - 04:40:52
Гость
Покинул форум
Сообщений всего: 86
Дата рег-ции: Окт. 2007
Помог: 0 раз(а)
ну естественно ну ты сказал цитирую "При обновлении браузера (например, клавишей F5) происходит повторное отправление данных из формы в базу"
ну ты даешь естественно добавляется повторно в базу
потому что при обновлении повторяется та операция которую ты производил до этого
если ты просто зашел на страницу и нажал F5 то нечего некуда не добавится
а если ты добавлял чтото и потом F5 то естественно процесс повторится
----- Лень - двигатель прогресса, имхо
Работаю над проектами в сфере информационного сайтостроения.
EuGen
Отправлено: 29 Ноября, 2007 - 09:38:29
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Этого легко избежать, если делать перенаправление после выполнения операция с базой.
В Вашем случае это будет выглядеть так:
И советую Вам делать перенаправление после обработки данных всегда.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Tiptop11
Отправлено: 20 Января, 2008 - 20:24:07
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2008
Помог: 0 раз(а)
А что делать если используются сессии?
Не являюсь профессиональным программером, так что спрашивать не очень стыдно))))
Проблема:
Открывается сессия ----> заполняется и отсылается форма (формируется SQL-запрос) ----> SQL-запрос записывается в сессионную переменную и при обращении к странице "корзины" формируем таблицу товаров на основании SQL-запроса...
НО... при возвращении на страницу, на которой происходит формирование строки запроса, тыцкаем на Ф5 и запрос (чтоб его) дописывается старой строкой (отправляется еще раз)...
Как этого избежать при использовании сессий?
Прошу помощи, а то я уже отчаялся((( мозги вскипают...
EuGen
Отправлено: 20 Января, 2008 - 21:06:49
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А в чем у Вас задача? Какая необходимость есть в переменную сессии записывать целый sql-запрос? Это и небезопасно может быть.
Расскажите, что Вы хотите сделать, и тогда станет ясно, как решить Вашу проблему.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Tiptop11
Отправлено: 21 Января, 2008 - 23:39:46
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2008
Помог: 0 раз(а)
Предполагаемый алгоритм работы:
0.Заходит на сайт посетитель, для него открывается сессия.
1.Выводится таблицей список товара (наименование, описание, цена, поле ввода количества товара).
2.Юзер вводит количество товара и нажимает кнопку "Положить в корзину".
3.Обрабатываем форму:
for ($i=0; $i<количество строк в таблице; $i++)
{
$string_name="a".$i;
if(isset($_POST[$string_name]) && $_POST[$string_name]!=0 && is_numeric($_POST[$string_name]))
{
$plus=" (id=$i) or ";
$query_mount=$query_mount.$plus;
}
}
$final_query="select * from Bla-Bla-Bla where".$query_mount; ну и отрезаем от строки запроса последние 4 символа - пробел or пробел.
4.На основе SQL-запроса в корзине формируем таблицу отмеченных юзверем позиций.
5.После заполнения юзером контактных данных и нажатия кнопки "Сформировать заказ" в корзине отправляем данные из формы на почту.
Переменная $final_query (строка SQL-запроса) принадлежит сессии потому как ее необходимо использовать в корзине (на основе этого SQL-запроса строится таблица заказанных позиций в корзине). Может я тут что-то и портачу, подскажите...
В принципе усё работает, только остаётся избавиться от проблемы злополучной проблемы "F5" (повторная отправка формы)...
А какие проблемы могут возникнуть с безопасностью?
Заранее пасип...
Dastar
Отправлено: 22 Января, 2008 - 00:02:28
Частый гость
Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008 Откуда: Израиль
Помог: -6 раз(а)
ТипТоп:
для избавления проблеммы перезагрузки всего навсего нужно добавить строчку:
Header("Location: name_script.php"); die;
----- Не знаешь - молчи.
EuGen
Отправлено: 22 Января, 2008 - 09:54:23
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
А, я то уж думал что Вы в переменной сессии полноценный sql - запрос храните.
Ну, а так, как обычно, помогает автоматическое перенаправление (как писал Dastar). Только помните - это отсылает хеадеры, то есть любой вывод нельзя делать до их отсылки. Иначе ничего не сработает.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Dastar
Отправлено: 22 Января, 2008 - 15:36:39
Частый гость
Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008 Откуда: Израиль
Помог: -6 раз(а)
А если перенаправление делать с помощью тега <meta> - важно где именно будет этот тег? И вообще, стоит ли?
----- Не знаешь - молчи.
EuGen
Отправлено: 22 Января, 2008 - 15:42:38
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Такой тег должен стоять в заголовке html документа. То бишь так:
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.