Предотвратить повторное выполнение сценария при обновлении страницы - PullRequest
4 голосов
/ 07 июня 2011

Я создаю свою собственную php cart за последнюю неделю, и я застрял в некоторых вопросах.

Мне удалось добавить новые товары в корзину, и URL выглядит так, как показано ниже.

http://blah-blah.com/order/index.php?action=add&id=84

Вопрос прост: как я могу предотвратить добавление того же товара в корзину? если кто-то обновит страницу? Потому что теперь каждый раз, когда кто-то обновляет страницу, он меняет количество на +1 для определенного элемента.

Кроме того, после перехода на страницу оформления заказа, если они нажмут кнопку возврата в браузере, ОПЯТЬ количество изменится на +1;

Любые рекомендации?

Ответы [ 6 ]

4 голосов
/ 07 июня 2011

Да.Пусть они установят , а не приращение количество.

Кроме того, вы обычно используете POST (не GET) запросов для такого рода действий,Браузеры знают об этом и хитро спрашивают пользователя, хотят ли они повторно отправить POST данные.

Самый чистый подход для вашего пользователя может заключаться в том, чтобы сделать все это с AJAX.Если они вернутся назад, они просто вернутся к последней странице, которую посетили без проблем.Это было бы эквивалентно тому, как отправляются комментарии о переполнении стека: вы не можете вернуться к шагу отправки и в конечном итоге написать повторяющиеся комментарии.

2 голосов
/ 07 июня 2011

Я бы предложил следующие шаги, чтобы избежать многократной отправки и проблем с кнопками возврата:

  1. Как указано выше, вы должны использовать метод POST для отправки формы вместо GET.
  2. Запретить отправку нескольких форм из одного сеанса, как описано здесь: http://phpsense.com/php/prevent-duplicate-form-submission.html
  3. После того, как вы закончите обработку запроса POST, вы должны будете перенаправить на URI подтверждения ИЛИ лучше на тот же URI, как указано ниже:

    // перенаправление после обработки запроса POST
    заголовок ("Местоположение:". $ _SERVER ["REQUEST_URI"]);
    выход;

0 голосов
/ 23 июля 2013

Я знаю, что этот вопрос закрыт, но у меня есть альтернатива, которую я придумал для этой конкретной проблемы.

Идея состоит в том, чтобы создать хеш данных $ _POST до и после.Для этого примера я использовал md5, но вы можете использовать любой алгоритм, который вам нужен:

$postHash = md5(serialize($_POST).date("dMY",time()));
if(!isset($_SESSION['post'])) $_SESSION['post']="Not yet set.";

Затем весь ваш код обработки, который обычно идет вверху страницы, вы просто помещаете в следующий IF:*

    if($_SESSION['post']!=$postHash) {
     // Perform actions
    } else {
  echo "Cannot post duplicate data";
}

Затем в нижней части страницы (или после завершения обработки и обработки любых вызовов базы данных):

$_SESSION['post'] = md5(serialize($_POST).date("dMY",time()));

Есть еще несколько проблем, но, похоже,работать хорошоНадеюсь, это поможет.

0 голосов
/ 13 января 2013

Привет, у меня нет для вас решения для кодирования, а скорее логическое решение , попробуйте, оно может вам помочь, оно помогло мне

Я столкнулся с тем жепроблема в том, что я использовал "ShoppingCart? AddToCart = 1 & ....." в своем URL (переменная GET), чтобы узнать, что пользователь хочет добавлять товары в корзину и каждый раз, когда я обновляюсьстраница, к которой один и тот же продукт добавлялся снова и снова

Мой способ работы, когда я получил запрос AddToCart , заключался в первом выполнении метода, который добавляет товар в корзину , а затем выполнить другой метод, который отобразит содержимое корзины (ЭТО БЫЛА ПРОБЛЕМА ПРЯМО ЗДЕСЬ)

Я немного изменил логику

Теперь, когда я получаю тот же Запрос AddToCart Я выполняю тот же первый метод , чтобы добавить содержимое в корзину

НО

Теперь вместо выполнения второгометод для отображения содержимого корзины Я использую заголовок («Location: ShoppingCart? ViewCart = 1»)

Это означает, что после выполнения первого метода, который добавляет содержимое в корзину, я делаю Запрос ViewCart на мою страницу корзины покупок, теперь каждый раз, когда я делаю запрос AddToCart , он корректно добавляет содержимое в корзину, и после этого всякий раз, когда я пытаюсь обновить страницу до попробуйте повторить запрос AddToCart Я всегда получаю Запрос ViewCart , и страница просто показывает содержимое корзины, а не добавляет какое-либо дополнительное содержимое в корзину

Трюкздесь каждый раз я получаю "ShoppingCart? AddToCart = 1 & ....." Я выполняю функцию Add и функцию заголовка таким образом, что я получаю отображение "ShoppingCart? ViewCart = 1 " в URL, а не в исходном " ShoppingCart? AddToCart = 1 & ..... "

Теперь, даже если некоторые пытаются обновить страницу иливозвращается тo страницу, использующую кнопку «Назад» в браузере, они всегда заканчивают, делая "ShoppingCart? ViewCart = 1" Запрос, они никогда не видят "ShoppingCart? AddToCart = 1 & ....." в URL

как я уже сказал, у меня нет решения для кодирования, а есть логическое решение

Надеюсь, это поможет

0 голосов
/ 07 июня 2011

Вы можете использовать

<?php
header("Location: http://www.example.com/"); /* Redirect browser */

Чтобы перенаправить пользователя на предыдущую страницу?Нажатие кнопки «Обновить» или «Назад» / «Вперед» не загрузит страницу добавления снова.

0 голосов
/ 07 июня 2011

Как сказал Томалак, лучше использовать данные POST для таких действий.Другой момент, который вы можете использовать в сочетании с данными POST, - это ответить пользователю заголовком перенаправления, тогда даже если он попытается обновить или вернуться, данные не будут обрабатываться снова.

базовый пример:

<?php
if( !empty($_POST) ){
  // do stuff with POST datas then
  header("location: mypage.php\n");
  exit;
}
...