当我按下浏览器上的'刷新'按钮时,似乎$_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/Getpost后发送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?>