Intereting Posts
Установка значения Php $ _SERVER ($ _SERVER ) с использованием Apache .htaccess Предотвращение инъекции SQL с помощью PHP Время PHP () возвращает отметку времени GMT / UTC? Загрузка файла Ajax с использованием Codeigniter Эффективный способ расчета количества внешних ключей во второй таблице и отображения его с помощью строк из первой таблицы – PHP – MySQL PHP preg_match для поиска и поиска динамического URL-адреса из HTML-страниц Как вставить INNER JOIN 3 таблицы с помощью CodeIgniter структуру каталогов для загрузки без сохранения на сервере FOSUserBundle AJAX Вход с Symfony2 (маршрутизация) PHP: регулярное выражение для получения URL-адреса из строки Может ли кто-нибудь сказать мне, как получить косвенно связанные классы с помощью Propel ModelCriteria? Входная страница Передача $ _SESSION Ошибка при использовании -> paginate () с Laravel исправление cakephp .htaccess / mod_rewrite для настроек общего хостинга PHP-переменная объекта чтения как часть другой переменной

Предотвращение повторного выполнения сценария при обновлении страницы

На прошлой неделе я создаю свой собственный php -телеграф, и я застрял в некоторых проблемах.

Мне удалось добавить новые вещи в корзину, и URL-адрес выглядит следующим образом.

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

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

Кроме того, после перехода на страницу проверки, если они нажмут кнопку «Назад» в браузере, AGAIN количество изменится на +1;

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

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

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

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

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

  1. Как было предложено выше, вы должны использовать метод POST для отправки своей формы вместо GET.
  2. Предотвращение отправки нескольких форм из того же сеанса, как описано здесь: http://phpsense.com/php/prevent-duplicate-form-submission.html
  3. По завершении обработки запроса 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-адресе

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

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