За последние 24 часа нас посетили 17183 программиста и 1787 роботов. Сейчас ищут 1394 программиста ...

защита от обновления формы F5

Тема в разделе "PHP и базы данных", создана пользователем oksana, 19 апр 2012.

  1. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Была у меня проблема думала сделаю вид что все ок =) но все же

    есть простая форма к примеру
    Код (Text):
    1.  
    2. <form action="obr.php" method="post">
    3. <input type="text" name="name">
    4. <input type="submit" value="Добавить">
    5. </form>
    obr.php
    Код (Text):
    1.  
    2. $name = $_REQUEST["name"];
    3. $name = mysql_real_escape_string($name);
    4. mysql_query ("INSERT INTO table (name) VALUES ('$name')");
    при заполнении формы если посетитель обновить страницу, то добавиться такое же объявление =(
    Как это избежать? слышала что в скрытый Input надо вставить что то
     
  2. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    если я правильно понимаю, то второе добавление в БД происходит уже после первого субмита формы?
    ну тогда как простейший вариант, сделай скрытое поле с id записи из БД, после того как запись добавится и при последующих обновлениях проверяй есть там этот идентификатор или нет.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    простейший - редирект, а токен - это уже умный подход.
     
  4. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Да, второе обновление происходит после первого нажатия
    если не ошибаюсь то редирект это перенапрсвление
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  6. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    Да, второе обновление происходит после первого нажатия
    если не ошибаюсь то редирект это перенапрсвление, он стоит, принцип как на этом форуме
    нажимаешь отправить вывод сообщ. добавлено и обновляется

    тут попыталась нажать F5 вышло
    Было добавлено по крайней мере одно сообщение в этой теме. Возможно, вы захотите изменить содержание своего сообщения

    Добавлено спустя 1 минуту 39 секунд:
    А как сделать чтобы происходила проверка по базе есть ли такой id или как лучше?
     
  7. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Код (PHP):
    1. $name = $_REQUEST["name"];
    2. $name = mysql_real_escape_string($name);
    3. mysql_query ("INSERT INTO table (name) VALUES ('$name')");
    4. header("Location: ".$_SERVER["REQUEST_URI"].""); // <--
    5.  
     
  8. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    долго грузилось и выдало ошибку 301 если не ошибаюсь =(
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Сделай страничку где писалось что допустим заявка принята, можно добавить какие-то детали и т.д. и перенаправляй туда header()
    Так работают почти все сайты
     
  10. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    не очень поняла куда и как вставить

    вот обработчик
    Код (Text):
    1.  
    2. <?
    3. $name = $_REQUEST["name"];
    4. $name = mysql_real_escape_string($name);
    5. ?>
    6. <html>
    7.  
    8. <head>
    9. </head>
    10.  
    11. <body>
    12. <?
    13. $name = mysql_real_escape_string($name);
    14. $result = mysql_query ("INSERT INTO table (name) VALUES ('$name')");
    15.  
    16. if ($result == 'true') {
    17.               echo "<p align='center'>Ваш отзыв добавлен</p>";
    18.     echo "<meta http-equiv='refresh' content='2; URL=http://www...>";
    19.     }
    20.     else {echo "<p align='center'>Отзыв не добавлен, вернитесь назад и проверьте правильность ввода</p>";}
    21. ?>
    22. </body>
    23.  
    24. </html>
    куда вставить header() ? или нужно создать еще одну страницу?
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    мляха буха. вы б хоть читали код, который вам дают. Может там "удалить всю базу наxyй" содержится. внимательнее надо быть.

    идея состоит в том чтобы редиректнуть браузер по какому-нить адресу после обработки формы. тогда по f5 будет обновляться та страница просто.
     
  12. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А чем сессии не устраиваютс?)))
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а при чем тут сессии?
     
  14. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Код (PHP):
    1. if(!$_SESSION['post')){
    2.     обрабатываем $_POST, отправляем данные в бд;
    3.     $_SESSION['post']=true;
    4. } 
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и чего вы добьетесь этим? =)

    вас мама думать не учила? а папа? бабушка? ну хоть кто-нибудь? думать надо на пару шагов вперед.

    а если человек решит отправить другую форму? а если он две заполнил в разных вкладках браузера?
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.120
    Симпатии:
    1.245
    Адрес:
    там-сям
    html-программист правильно написал, только вместо $_REQUEST надо писать $_POST. зачем нам оставлять возможность те же данные слать через GET-запрос, а? нюанс!!!

    Добавлено спустя 1 минуту 51 секунду:
    oksana, F5 повторяет последний запрос. в случае с редиректом повторится не отсылка данных, а просто переход на страницу. в этом суть фокуса.

    Добавлено спустя 1 минуту 43 секунды:
    одмины, матное слово, сделайте пожалуйста ссылочку для обращения к пользователю. это ведь нетрудно и практически это стандарт. матное слово вам на голову.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я уже написал код для вставки имени. его надо только вкрячить. Но админы забили на нас =( грусть-печаль. Наверное много работы.
     
  18. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Дедушка меня учил думать. Всегда говорил "ты еще вечный двигатель не изобрел?". И я его пытался всегда изобрести, но у меня никогда не получалось :(

    Во первых, сессии не я предложил. Я предложил в хедере отправить Location.
    Во вторых, о отправке другой формы я подумал, но решил не писать, потому что сессии не я предложил.

    Код (PHP):
    1. if($_SESSION['name']!=$_POST['name'] && $_SESSION['text']!=$_POST['text'] && $_SESSION['shit']!=$_POST['shit']){
    2.     обрабатываем $_POST, отправляем в базу данных
    3.     $_SESSION['name']=$_POST['name'];
    4.     $_SESSION['text']=$_POST['text'];
    5.     $_SESSION['shit']=$_POST['shit'];
    6. } 
    Добавлено спустя 1 минуту 4 секунды:
    О $_REQUEST у Попова ничего не сказано.
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.120
    Симпатии:
    1.245
    Адрес:
    там-сям
    а, ну понял. код кроме редиректа скопирован у Попова oksana. ну надеюсь Попов oksana поняла о чем речь.

    Добавлено спустя 45 секунд:
    p.s. матное слово про тег [ s ] и вообще…

    Добавлено спустя 42 секунды:
    вот вместо того чтобы хуи вырезать с форума лучше бы над юзабилити поработали
     
  20. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Не, при чем тут oksana? Я учился программировать по видеокурсам Попова, поэтому не знаю, что такое $_REQUEST
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.120
    Симпатии:
    1.245
    Адрес:
    там-сям
    ну ничего, ничего… зато у вас улыбка хорошая
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и прическа
     
  23. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Слопал две апельсинки. Теперь думаю, слопать третью или оставить на завтра?
     
  24. oksana

    oksana Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    221
    Симпатии:
    0
    кстати я тоже училась у попова

    Добавлено спустя 54 секунды:
    html-программист а как вы оцениваете уроки попова?
     
  25. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Попов в пхп - это как бейсик в программировании. Хочешь научиться программировать - обходи бейсик стороной. Он калечит разум молодых программистов. Так-же и с поповым.