За последние 24 часа нас посетили 22337 программистов и 997 роботов. Сейчас ищут 652 программиста ...

Предотвратить повторную обработку $_POST переменных при обновлении страницы

Тема в разделе "PHP для новичков", создана пользователем Stairdeck, 6 янв 2017.

Метки:
  1. Stairdeck

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

    С нами с:
    9 ноя 2014
    Сообщения:
    47
    Симпатии:
    0
    Адрес:
    Россия
    Здравствуйте!
    Появилась проблема, которую надо решить. Я сейчас пишу небольшой модуль, небольшой магазинчик.
    В общем, основано там все на обработке $_POST данных.

    Есть формочка:
    HTML:
    1.  
    2. <form id="prices" method="POST">
    3.     <input type="hidden" name="itemid" value="<?php echo $shop->item['gid']; ?>">
    4.     <input type="hidden" name="itemname" value="<?php echo $shop->item['name']; ?>">
    5.     <input name="buy" required type="range" min="1" max="64" onmousemove="if ( (this.value * this.value) && this.value > 0 ) this.nextElementSibling.value = 'Купить '+ Math.ceil(this.value * <?php echo $shop->item['amount']; ?>) +' единиц товара за '+ Math.ceil(this.value * <?php echo $shop->item['price']; ?>) +' рублей'" placeholder="Сколько хотите купить?">
    6.     <input name="pricbuy" type="submit" value="Купить за рубли">
    7. </form>
    8. </form>
    Есть обработчик:

    PHP:
    1. if(isset($_POST['pricbuy'])) {
    2.  
    3.  
    4.     $q = $shop->buyItemByMoney($user->userdata['name'], $_POST['itemid'], $_POST['itemname']);
    5.  
    6.     if(!$q) echo '<script>alert("Ошибка, возможно, недостаточно средств");</script>';
    7.     else echo '<script>alert("Успешная покупка");</script>';
    8. }
    Прикол весь в том, что при нажатии на кнопку все нормально, покупается, но $_POST данные остаются в тех же значениях. И тупо обновив страницу покупка произойдет ещё раз, и это до тех пор, пока пользователь не вернётся обратно по кнопке "назад" (таковая имеется).

    Как можно решить данную проблему? Я пробовал пользоваться функцией unset после покупки, не помогает.
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну так известно же. Редиректить надо на страницу с успехом.
    PHP:
    1. if (данные_из_POST_корректно_обработаны()) {
    2.     header("Location: success.php");
    3.     die;  
    4.  }
     
    Fell-x27 и jenya77 нравится это.
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Внесем уточнение - никто не запрещает использовать в качестве абстрактной "success.php" любую страницу сайта, хоть ту же, с которой была сделана отправка.

    Плюс, желательно банально очищать корзину после покупки, чтобы не было подобной проблемы. То есть, ориентироваться не только на то, что приходит от клиента, но и хранить дубликат его корзины, например, в сессии. Некоторые хранят в куках или в web-storage. Главное, чтобы после подтверждения покупки, любое из приведенных хранилищ очищалось. Тогда, если к нам приходит запрос на покупку такого-то товара, мы, не найдя его в корзине, просто отклоняем запрос. Но это специфика конкретно магазинов. В общем же случае, переадресация заголовком не должна быть частью или опорой вашей бизнес-логики, или какой-то мерой защиты. На самом деле это больше для пользователя, чтобы его не донимала и не пугала просьба повторной отправки формы. Исключительные ситуации все равно желательно как-то контролировать на уровне сервера.