На прошлой неделе я создаю свой собственный php -телеграф, и я застрял в некоторых проблемах.
Мне удалось добавить новые вещи в корзину, и URL-адрес выглядит следующим образом.
http://blah-blah.com/order/index.php?action=add&id=84
Вопрос прост: как я могу предотвратить добавление одного и того же элемента в корзину, если кто-то обновит страницу? Причина теперь каждый раз, когда кто-то обновляет страницу, она меняет количество на +1 для определенного элемента.
Кроме того, после перехода на страницу проверки, если они нажмут кнопку «Назад» в браузере, AGAIN количество изменится на +1;
Любые рекомендации?
Да. Попросите их установить , а не увеличивать количество.
Кроме того, вы обычно используете запросы POST
(не GET
) для такого рода действий. Браузеры знают это и хитро спрашивают у пользователя, хотят ли они повторно отправлять данные POST
.
Самый чистый подход для вашего пользователя может заключаться в том, чтобы делать все с AJAX. Если они вернутся, они вернутся на последнюю страницу, которую они посетили, без проблем. Это будет равносильно тому, как отправляются комментарии к переполнению стека: вы не можете вернуться к шагу представления и в итоге написать дубликаты комментариев.
Я бы предложил следующие шаги, чтобы избежать нескольких проблем с отправкой и обратной кнопкой:
По завершении обработки запроса POST вы должны перенаправить на URI подтверждения или лучше на тот же URI, как показано ниже:
// перенаправлять после обработки запроса POST
header ("Location:". $ _SERVER ["REQUEST_URI"]);
Выход;
Как сказал Томалак, лучше использовать данные POST для такого рода действий. Другой момент, который вы можете использовать вместе с данными POST, – это ответить пользователю на заголовок перенаправления, и даже если он попытается обновить или вернуться, данные не будут обрабатываться повторно.
базовый пример:
<?php if( !empty($_POST) ){ // do stuff with POST datas then header("location: mypage.php\n"); exit; }
Вы можете использовать
<?php header("Location: http://www.example.com/"); /* Redirect browser */
Перенаправить пользователя на предыдущую страницу? Нажатие кнопки обновления или кнопки «назад / вперед» не загрузит страницу добавления еще раз.
Я знаю, что этот вопрос закрыт, Но у меня есть альтернатива, которую я придумал для этой точной проблемы.
Идея заключается в создании хэша данных $ _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()));
Есть еще несколько проблем, но, похоже, все в порядке. Надеюсь это поможет.
Привет, у меня нет для вас решения для кодирования, а скорее логическое решение этой проблемы, дайте ему попробовать, это может вам помочь, это помогло мне
Я столкнулся с той же проблемой, когда я использовал «ShoppingCart? AddToCart = 1 & …..» в своем URL (GET Variable) как способ узнать, что пользователь хочет добавлять продукты в корзину, и каждый раз, когда я обновляю страницу тот же продукт снова и снова добавлялся
Мой способ работы, когда я получил запрос AddToCart, состоял в том, чтобы сначала выполнить метод, который добавит продукт в корзину, а затем выполнить другой метод, который отобразит содержимое корзины (ЭТО БЫЛО ПРОБЛЕМА ПРАВО ЗДЕСЬ)
Я немного изменил логику
Теперь, когда я получаю тот же запрос AddToCart, я выполняю тот же первый метод, чтобы добавить содержимое в корзину
НО
Теперь вместо того, чтобы выполнять второй метод отображения содержимого корзины, я использую заголовок («Location: ShoppingCart? ViewCart = 1»)
Это означает, что после выполнения первого метода, который добавляет контент в корзину, я делаю запрос ViewCart на мою страницу корзины покупок, теперь каждый раз, когда я делаю запрос AddToCart, он правильно добавляет содержимое в корзину и после этого всякий раз, когда я пытаюсь обновить страница, чтобы попытаться выполнить репликацию запроса AddToCart, я всегда получаю запрос ViewCart, и страница просто показывает содержимое корзины и не добавляет в корзину больше содержимого
Трюк здесь заключается в том, что каждый раз, когда я получаю «ShoppingCart? AddToCart = 1 & …..», я выполняю функцию «Добавить» и функцию заголовка таким образом, что в итоге я показываю «ShoppingCart? ViewCart = 1» в URL, а не оригинальный «ShoppingCart? AddToCart = 1 & …..»
Теперь даже если некоторые пытаются обновить страницу или вернуться на страницу с помощью кнопки «Назад» в браузере, они всегда заканчивают создание запроса «ShoppingCart? ViewCart = 1» , они никогда не видят «ShoppingCart? AddToCart = 1 & ….. " в URL-адресе
как я уже сказал, у меня нет решения для кодирования, а скорее из логического решения
Надеюсь это поможет