如何在按'Refresh'时删除$_POST变量按钮上的浏览器与PHP


How to delete $_POST variable upon pressing 'Refresh' button on browser with PHP?

当我按下浏览器上的'刷新'按钮时,似乎$_POST变量在刷新中保留。

如果我想删除$_POST的内容,我该怎么做?用unset代替$_POST的领域没有帮助。

帮助吗?谢谢!

请求头包含一些POST数据。无论您做什么,当您重新加载页面时,请求将再次发送。

简单的解决方案是重定向到一个新的(如果不是相同的)页面。这种模式在web应用程序中非常常见,称为Post/Redirect/Get。这是典型的所有表单做POST,然后如果成功,你应该做一个重定向。

尽量将视图脚本(主要是html)与控制器脚本(业务逻辑和东西)分开(在不同的文件中)。通过这种方式,您将始终将数据发送到单独的控制器脚本,然后重定向回视图脚本,该脚本在呈现时将在请求头中不包含post数据。

为了防止用户刷新页面或按下后退按钮重新提交表单,我使用了以下小技巧:

<?php
if (!isset($_SESSION)) {
    session_start();
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['postdata'] = $_POST;
    unset($_POST);
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
}
// This code can be used anywhere you redirect your user to using the header("Location: ...")
if (array_key_exists('postdata', $_SESSION)) {
    // Handle your submitted form here using the $_SESSION['postdata'] instead of $_POST
    // After using the postdata, don't forget to unset/clear it
    unset($_SESSION['postdata']);
}
?>

POST数据现在在会话中,用户可以任意刷新。它将不再对你的代码有影响。

用例/例子
<!-- Demo after submitting -->
<?php if (array_key_exists('postdata', $_SESSION)): ?>
    The name you entered was <?= $_SESSION['postdata']['name']; ?>.
    <!-- As specified above, clear the postdata from the session -->
    <?php unset($_SESSION['postdata']); ?>
<?php endif; ?>
<!-- Demo form -->
<?php if (!isset($_SESSION['postdata'])): ?>
<form method="POST" action="<?= $_SERVER['PHP_SELF']; ?>">
    Name: <input type="text" name="name" /><br />
    <input type="submit" value="Submit" />
</form>
<?php endif; ?>

简单的PHP解决方案:

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

当页面重新加载时,它将在屏幕上更新新数据并清除$_POST)

这是一个常见的问题。

这里有一个类似问题的链接。你可以在这里看到我的答案。为什么POST['submit']是设置当我重新加载?

基本答案是查看post/redirect/get,但由于通过示例更容易看到,所以只需查看上面的链接。

我通常的技巧是:

<?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;
   }
}
?>

如何使用$_POST = array(),它使数据无效。浏览器仍然会请求重新加载,但是$_POST超全局变量中不会有任何数据。

$_POST应该只在POST请求时填充。浏览器通常发送GET请求。如果您通过POST到达一个页面,它通常会在您点击刷新时询问您是否应该重新发送POST数据。它所做的只是再次发送POST数据。对于PHP来说,这看起来像是一个不同的请求,尽管它在语义上包含相同的数据。

这将删除刷新时恼人的确认提交,代码不言自明:

if (!isset($_SESSION)) {
session_start();
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$_SESSION['postdata'] = $_POST;
unset($_POST);
header("Location: ".$_SERVER[REQUEST_URI]);
exit;
}
if (@$_SESSION['postdata']){
$_POST=$_SESSION['postdata'];
unset($_SESSION['postdata']);
}

你不能,这是由浏览器处理的,而不是由任何编程语言。您可以使用AJAX发出请求或将用户重定向到相同(或另一个)页面。

最好的方法是Post/Redirect/Get

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

post后发送302头指向成功页面

我在一家在线面料商店遇到了这个问题,在产品页面上有一个订购面料样品的按钮,如果客户先订购了产品,然后想订购不同颜色的样品,他们之前的订单将被复制,因为他们从未离开过页面,post数据仍然存在。

我唯一能做到这一点的可靠方法是添加一个重定向页面(或者在我的情况下,在WordPress中,添加action到"parse_request"对于模拟url),它将重定向回引用页面。

Javascript:

window.location.href = '/hard-reset-form';
PHP:

header('Location: ' . $_SERVER['HTTP_REFERER']);
die();

这样您将返回到一个新页面,所有POST数据都被清除。

设置一个中间页面,将$_POST变量更改为$_SESSION。在实际页面中,请在使用后取消设置。

您也可以传递初始页面URL来设置浏览器返回按钮。

我有一个单一的表单和显示,我使用一个表单和一个提交按钮"添加/删除/编辑/插入/移动"数据记录。我首先要做的是检查$_post是否设置,如果没有设置,则将其设置为空。然后运行剩下的代码,

然后在实际的$_post的我根据输入的数据使用开关和if/else,并对正在使用的功能所需的每个数据部分进行错误检查。

在它对数据做了任何处理之后,我运行一个函数来清除每个部分的所有$_post数据。你可以点击刷新,直到你的蓝色在脸上它不会做任何事情,只是刷新页面和显示。

所以你只需要逻辑思考,让你的用户不会傻…

try

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

我可以看到这是一个旧的线程,只是想我给我的2美分。我不确定它是否适合所有场景,但这是我多年来一直成功使用的方法:

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

并没有真正从浏览器中删除POST后的值,但就这些行下面的php脚本而言,没有更多的POST变量。

这是您可以做到的最简单的方法,因为您不能通过刷新页面来清除$_POST数据,而是通过离开页面并再次返回。

这将是你想要清除$_POST数据的页面。

<a class="btn" href="clear_reload.php"> Clear</a> // button to 'clear' data

现在创建clear_reload.php .

clear_reload.php:

<?php
header("Location: {$_SERVER['HTTP_REFERER']}");
?>

"清除"按钮将引导您到这个clear_reload.php页面,它将重定向您回到您所在的同一页面。

如果不知怎么的,问题与多个插入到您的数据库"刷新"。检查我的答案在这里Unset post变量表单提交后。这应该会有所帮助。

Post数据可以通过一些技巧变得清晰。

<?php
if (!isset($_SESSION)) {
    session_start();
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $_SESSION['postdata'] = $_POST;
    unset($_POST); //unsetting $_POST Array
    header("Location: ".$_SERVER['REQUEST_URI']);//This will let your uri parameters to still exist
    exit;
}
?>

在我的例子中,我使用了下面的技巧,一旦$_POST操作完成后,将用户重定向到同一页面。

的例子:

if(!empty($_POST['message'])) {
    // do your operation here
    header('Location: '.$_SERVER['PHP_SELF']);
}

这是一个非常简单的技巧,我们重新加载页面没有post变量。

我看到这个问题已经得到了回答。然而,我遇到了同样的问题,并通过在php脚本的头中添加以下内容来修复它。

header("Pragma: no-cache");

Post/Redirect/Get无疑是一个很好的做法。但即使没有这些,上述内容也应该能解决问题。

我在我的帐户页面上有一个表单,它用POST方法发送数据,我必须将收到的数据存储在数据库中。数据库中的数据应该显示在网页上,但我必须在POST请求后刷新页面以显示数据库中的内容。为了解决这个问题,我在帐户页面上写了以下代码:

if (isset($_POST['variable'])){
 echo '
 <script type="text/javascript">
  location.href="./index.php?result=success";
 </script>';
}

然后在index.php上刷新页面并将用户发送回我的帐户页面,如下所示:

if (isset($_GET['result'])) {
    echo'<script>
    //reloads the page  
    location.reload();
    //send user back to account.php
    location.href="./account.php"
   </script>'
}

你应该在标题中添加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' ); 
?>

这个适合我:

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