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
Форумы портала PHP.SU :: Версия для печати :: Повторная отправка данных из формы
Форумы портала PHP.SU » PHP » Программирование на PHP » Повторная отправка данных из формы

Страниц (2): [1] 2 »
 

1. mart-akm - 29 Ноября, 2007 - 03:50:12 - перейти к сообщению
При обновлении браузера (например, клавишей 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>
2. Snic - 29 Ноября, 2007 - 04:40:52 - перейти к сообщению
ну естественно ну ты сказал цитирую "При обновлении браузера (например, клавишей F5) происходит повторное отправление данных из формы в базу"
ну ты даешь естественно добавляется повторно в базу
потому что при обновлении повторяется та операция которую ты производил до этого
если ты просто зашел на страницу и нажал F5 то нечего некуда не добавится
а если ты добавлял чтото и потом F5 то естественно процесс повторится
3. EuGen - 29 Ноября, 2007 - 09:38:29 - перейти к сообщению
Этого легко избежать, если делать перенаправление после выполнения операция с базой.
В Вашем случае это будет выглядеть так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. if (isset($_GET['success']))
  4. {
  5.    $message=$_GET['success']?'Информация добавлена в базу данных':'Данные не внесены в базу, обратитесь к администратору!';
  6.    echo($message);
  7. };
  8.  
  9. if ($_POST['vvod']=='1')
  10. {
  11.    if (!$_POST['email'] || $_POST['email']=="" || strlen($_POST['email'])>30)
  12.    {
  13.       $message='Вы не ввели email, любо ваш email более 30 знаков';
  14.    }
  15.    else
  16.    {
  17.       //Открываем соединение с базой
  18.       mysql_connect("localhost", "root", "") or die ("Нет соединения с базой данных, обратитесь к администратору!");
  19.       mysql_select_db("patexexpert");
  20.  
  21.       //Заносим инфу из формы в базу
  22.       $as_email=addslashes($_POST['email']);
  23.       $tr_email=trim($as_email);
  24.       $query="INSERT INTO mail(id, email) VALUES (null, '$tr_email')";
  25.       $result=mysql_query($query);
  26.       $noform_var=0;
  27.       if (mysql_affected_rows()==1)
  28.          $noform_var=1;
  29.       else
  30.           error_log(mysql_error());
  31.       //Делаем перенаправление, обратите внимание, что я перенес Ваши сообщения об ошибках/успехе.
  32.       header("Location: your_script.php?success=$noform_var");
  33.    }
  34. }
  35. //Выводим форму во всех случаях, кроме тех, когда передача формы заверашается успешно
  36. if (!$noform_var)//если было перенаправление, то $noform_var не задано и форма будет выведена
  37. {
  38.    $thisfile=$_SERVER['PHP_SELF'];
  39.    $message.='<p>Введите свой мейл:</p>
  40.   <form action="'.$thisfile.'" method="post">
  41.   <input name="email" type="text" size="25" />
  42.   <input name="q" type="text" size="12" value="'.$_POST['q'].'" />
  43.   <input name="vvod" type="hidden" value="1" />
  44.   <input name="submit" type="submit" value="Submit" />
  45.   </form>';
  46. }
  47. ?>
  48. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  49. <html xmlns="http://www.w3.org/1999/xhtml">
  50. <head>
  51. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
  52. <title>Тест</title>
  53. </head>
  54.  
  55. <body>
  56. <? echo $message;?>
  57. </body>
  58. </html>
  59.  

И советую Вам делать перенаправление после обработки данных всегда.
4. Tiptop11 - 20 Января, 2008 - 20:24:07 - перейти к сообщению
А что делать если используются сессии?

Не являюсь профессиональным программером, так что спрашивать не очень стыдно))))

Проблема:
Открывается сессия ----> заполняется и отсылается форма (формируется SQL-запрос) ----> SQL-запрос записывается в сессионную переменную и при обращении к странице "корзины" формируем таблицу товаров на основании SQL-запроса...

НО... при возвращении на страницу, на которой происходит формирование строки запроса, тыцкаем на Ф5 и запрос (чтоб его) дописывается старой строкой (отправляется еще раз)...

Как этого избежать при использовании сессий?
Растерялся
Прошу помощи, а то я уже отчаялся((( мозги вскипают...
5. EuGen - 20 Января, 2008 - 21:06:49 - перейти к сообщению
А в чем у Вас задача? Какая необходимость есть в переменную сессии записывать целый sql-запрос? Это и небезопасно может быть.
Расскажите, что Вы хотите сделать, и тогда станет ясно, как решить Вашу проблему.
6. Tiptop11 - 21 Января, 2008 - 23:39:46 - перейти к сообщению
Предполагаемый алгоритм работы:
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" (повторная отправка формы)...

А какие проблемы могут возникнуть с безопасностью?

Заранее пасип... Улыбка
7. Dastar - 22 Января, 2008 - 00:02:28 - перейти к сообщению
ТипТоп:
для избавления проблеммы перезагрузки всего навсего нужно добавить строчку:
Header("Location: name_script.php"); die;
8. EuGen - 22 Января, 2008 - 09:54:23 - перейти к сообщению
А, я то уж думал что Вы в переменной сессии полноценный sql - запрос храните.
Ну, а так, как обычно, помогает автоматическое перенаправление (как писал Dastar). Только помните - это отсылает хеадеры, то есть любой вывод нельзя делать до их отсылки. Иначе ничего не сработает.
9. Dastar - 22 Января, 2008 - 15:36:39 - перейти к сообщению
А если перенаправление делать с помощью тега <meta> - важно где именно будет этот тег? И вообще, стоит ли?
10. EuGen - 22 Января, 2008 - 15:42:38 - перейти к сообщению
Такой тег должен стоять в заголовке html документа. То бишь так:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <html>
  3. <head>
  4. ..тут могут быть теги meta ..
  5. </head>
  6. <body>
  7. ...
  8. </body>
  9. <html>
  10.  
11. Dastar - 22 Января, 2008 - 15:46:18 - перейти к сообщению
можно делать так:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?
  3. echo "Something";
  4. ?>
  5. <html>
  6. <head>
  7. <meta><!--Теги мета-->
  8. </head>...
  9.  
?
12. EuGen - 22 Января, 2008 - 15:54:42 - перейти к сообщению
Можно то можно, но по логике работать не должно. Хотя я и не проверял.
13. OverNik - 23 Января, 2008 - 07:41:57 - перейти к сообщению
А не лутше всего использивать
CODE (text):
скопировать код в буфер обмена
  1. header('location: Адрес переадресации);

Помоему самый простенький вариант!
14. Tiptop11 - 24 Января, 2008 - 18:33:59 - перейти к сообщению
Радость Усё, ТипТоп!!!

Сделал усё хедерами!!! Радость

Спасипа, ДрУгИ!!! Превосходно
15. 2Kem - 15 Марта, 2009 - 13:41:03 - перейти к сообщению
народ можно пример строка ввод информации при нажатии на кнопочку она записывается в базу

 

Powered by ExBB FM 1.0 RC1