Подтвердить что ты не робот

Как удалить переменную $_POST при нажатии кнопки "Обновить" в браузере с помощью PHP?

Когда я нажимаю кнопку "Обновить" в моем браузере, кажется, что переменная $_POST сохраняется во время обновления.

Если я хочу удалить содержимое $_POST, что мне делать? Использование unset для полей $_POST не помогло.

Помощь? Спасибо!

4b9b3361

Ответ 1

Заголовок запроса содержит некоторые данные POST. Независимо от того, что вы делаете, когда вы перезагружаете страницу, rquest будет отправлен снова.

Простым решением является перенаправление на новую (если не та же) страницу. Этот шаблон очень распространен в веб-приложениях и называется Post/Redirect/Get. Типично для всех форм делать POST, а затем в случае успеха вы должны сделать перенаправление.

Попробуйте как можно больше разделить (в разных файлах) свой вид script (html в основном) с вашего контроллера script (бизнес-логика и прочее). Таким образом, вы всегда отправляете данные отдельному контроллеру script, а затем перенаправляете обратно в представление script, которое при визуализации не будет содержать данных POST в заголовке запроса.

Ответ 2

Простое решение PHP для этого:

if (isset($_POST['aaa'])){
echo '
<script type="text/javascript">
location.reload();
</script>';
}

Когда страница перезагружается, она обновит на экране новые данные и очистит $_POST ;)

Ответ 3

Это общий вопрос здесь.

Вот ссылка на аналогичный вопрос. Вы можете увидеть мой ответ. Почему POST ['submit'] установлен при перезагрузке?

Основной ответ - посмотреть в post/redirect/get, но так как это проще увидеть на примере, просто проверьте ссылку выше.

Ответ 4

Как насчет использования $_POST = array(), который сводит на нет данные. Браузер по-прежнему будет запрашивать перезагрузку, но в суперглобале $_POST данных не будет.

Ответ 5

Чтобы пользователи не обновляли страницу или не нажимали кнопку "Назад" и не возвращали форму, я использую следующий аккуратный небольшой трюк.

<?php

if (!isset($_SESSION)) {
    session_start();
}

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['postdata'] = $_POST;
    unset($_POST);
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
}
?>

Данные POST теперь находятся в сеансе, и пользователи могут обновлять, сколько они хотят. Это не повлияет на ваш код.

Ответ 6

$_ POST должен заполняться только по запросам POST. Браузер обычно отправляет запросы GET. Если вы достигли страницы через POST, она обычно спрашивает вас, следует ли ей повторно отправлять данные POST при нажатии обновления. То, что он делает, просто то, что снова отправляет данные POST. Для PHP, который выглядит как другой запрос, хотя он семантически содержит одни и те же данные.

Ответ 7

попробовать

unset($_POST);
unset($_REQUEST);
header('Location: ...');

это сработало для меня

Ответ 8

Вы не можете, это обрабатывается браузером, а не каким-либо языком программирования. Вы можете использовать AJAX для запроса или перенаправления пользователя на ту же (или другую) страницу.

Ответ 9

Вы должны добавить директиву no cache в свой заголовок:

<?php
header( 'Cache-Control: no-store, no-cache, must-revalidate' ); 
header( 'Cache-Control: post-check=0, pre-check=0', false ); 
header( 'Pragma: no-cache' ); 
?>

Ответ 10

Моя обычная техника для этого:

<?php
if ($_POST) {
   $errors = validate_post($_POST);

   if ($!errors) {
       take_action($_POST);
       // This is it (you may want to pass some additional parameters to generate visual feedback later):
       header('Location: ?');
       exit;
   }
}
?>

Ответ 11

Задайте промежуточную страницу, на которой переменные $_POST изменяются в $_SESSION. На вашей фактической странице отключите их после использования.

Вы также можете передать URL-адрес начальной страницы, чтобы установить кнопку возврата назад.

Ответ 12

У меня есть одна форма и отображение, где я "добавляю/удаляю/редактирую/вставляю/перемещаю" записи данных с помощью одной формы и одной кнопки отправки. Первое, что я делаю, это проверить, установлен ли $_post, если нет, установить его в никуда. затем я пробегаю остальную часть кода,

то на фактическом $_post Я использую переключатели и if/else на основе введенных данных и с проверкой ошибок для каждой части данных, необходимой для использования какой-либо функции.

После того, как он делает что-либо для данных, я запускаю функцию, чтобы очистить все данные $_post для каждого раздела. вы можете поражать обновление до синего цвета, если оно ничего не сделает, кроме обновления страницы и отображения.

Итак, вам просто нужно логически мыслить и сделать это идиотом для своих пользователей...

Ответ 13

"Лучший" способ сделать это - Post/Redirect/Get

http://en.wikipedia.org/wiki/Post/Redirect/Get

После отправки сообщения заголовок 302, указывающий на страницу успеха

Ответ 14

Я вижу, что это старый поток, просто подумал, что я дам свои 2центы. Не уверен, что это будет соответствовать каждому сценарию, но это метод, который я успешно использовал в течение нескольких лет:

session_start();
if($_POST == $_SESSION['oldPOST']) $_POST = array(); else $_SESSION['oldPOST'] = $_POST;

Не удаляет POST-значения из браузера, но насколько ваш php script ниже этих строк, больше нет переменных POST.

Ответ 15

Это работает для меня:

<?if(isset($_POST['oldPost'])):?>
    <form method="post" id="resetPost"></form>
    <script>$("#resetPost").submit()</script>
<?endif?>

Ответ 16

Вы можете сделать это следующим образом:

echo('<script type="text/javascript">location.reload(true);</script>');

Это перезагружает страницу с сервера. Очень важно логическое "истинное". Это сработало для меня!