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 :: Повторная отправка данных из формы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
mart-akm
Отправлено: 29 Ноября, 2007 - 03:50:12
Post Id


Новичок


Покинул форум
Сообщений всего: 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>
 
 Top
Snic
Отправлено: 29 Ноября, 2007 - 04:40:52
Post Id



Гость


Покинул форум
Сообщений всего: 86
Дата рег-ции: Окт. 2007  


Помог: 0 раз(а)




ну естественно ну ты сказал цитирую "При обновлении браузера (например, клавишей F5) происходит повторное отправление данных из формы в базу"
ну ты даешь естественно добавляется повторно в базу
потому что при обновлении повторяется та операция которую ты производил до этого
если ты просто зашел на страницу и нажал F5 то нечего некуда не добавится
а если ты добавлял чтото и потом F5 то естественно процесс повторится


-----
Лень - двигатель прогресса, имхо Улыбка
Работаю над проектами в сфере информационного сайтостроения.
 
 Top
EuGen Администратор
Отправлено: 29 Ноября, 2007 - 09:38:29
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Этого легко избежать, если делать перенаправление после выполнения операция с базой.
В Вашем случае это будет выглядеть так:
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.  

И советую Вам делать перенаправление после обработки данных всегда.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tiptop11
Отправлено: 20 Января, 2008 - 20:24:07
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




А что делать если используются сессии?

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

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

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

Как этого избежать при использовании сессий?
Растерялся
Прошу помощи, а то я уже отчаялся((( мозги вскипают...
 
 Top
EuGen Администратор
Отправлено: 20 Января, 2008 - 21:06:49
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




А в чем у Вас задача? Какая необходимость есть в переменную сессии записывать целый sql-запрос? Это и небезопасно может быть.
Расскажите, что Вы хотите сделать, и тогда станет ясно, как решить Вашу проблему.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tiptop11
Отправлено: 21 Января, 2008 - 23:39:46
Post Id


Новичок


Покинул форум
Сообщений всего: 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" (повторная отправка формы)...

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

Заранее пасип... Улыбка
 
 Top
Dastar
Отправлено: 22 Января, 2008 - 00:02:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




ТипТоп:
для избавления проблеммы перезагрузки всего навсего нужно добавить строчку:
Header("Location: name_script.php"); die;


-----
Не знаешь - молчи.
 
 Top
EuGen Администратор
Отправлено: 22 Января, 2008 - 09:54:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




А, я то уж думал что Вы в переменной сессии полноценный sql - запрос храните.
Ну, а так, как обычно, помогает автоматическое перенаправление (как писал Dastar). Только помните - это отсылает хеадеры, то есть любой вывод нельзя делать до их отсылки. Иначе ничего не сработает.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Dastar
Отправлено: 22 Января, 2008 - 15:36:39
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




А если перенаправление делать с помощью тега <meta> - важно где именно будет этот тег? И вообще, стоит ли?


-----
Не знаешь - молчи.
 
 Top
EuGen Администратор
Отправлено: 22 Января, 2008 - 15:42:38
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Такой тег должен стоять в заголовке html документа. То бишь так:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <html>
  3. <head>
  4. ..тут могут быть теги meta ..
  5. </head>
  6. <body>
  7. ...
  8. </body>
  9. <html>
  10.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Dastar
Отправлено: 22 Января, 2008 - 15:46:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 199
Дата рег-ции: Янв. 2008  
Откуда: Израиль


Помог: -6 раз(а)




можно делать так:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <?
  3. echo "Something";
  4. ?>
  5. <html>
  6. <head>
  7. <meta><!--Теги мета-->
  8. </head>...
  9.  
?

(Отредактировано автором: 22 Января, 2008 - 15:47:29)



-----
Не знаешь - молчи.
 
 Top
EuGen Администратор
Отправлено: 22 Января, 2008 - 15:54:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можно то можно, но по логике работать не должно. Хотя я и не проверял.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
OverNik
Отправлено: 23 Января, 2008 - 07:41:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 182
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




А не лутше всего использивать
CODE (text):
скопировать код в буфер обмена
  1. header('location: Адрес переадресации);

Помоему самый простенький вариант!
 
 Top
Tiptop11
Отправлено: 24 Января, 2008 - 18:33:59
Post Id


Новичок


Покинул форум
Сообщений всего: 3
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Радость Усё, ТипТоп!!!

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

Спасипа, ДрУгИ!!! Превосходно
 
 Top
2Kem
Отправлено: 15 Марта, 2009 - 13:41:03
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




народ можно пример строка ввод информации при нажатии на кнопочку она записывается в базу

(Отредактировано автором: 15 Марта, 2009 - 13:42:06)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB