有没有办法做到以上几点?基本上,如果有人在提交表单一次后按下刷新,我不希望再次提交表单。在这种情况下,浏览器会询问,您是否要再次提交表单。在这种情况下unset($_POST['username'])
会有任何帮助吗?
答案 0 :(得分:10)
post / redirect / get是一个很好的选择,因为一些海报已经提到过。
我能想到的另一种方法是在dostuff.php页面中设置一个会话,以表明发布已经完成。每次检查此会话var,以查看是否因页面刷新而再次加载页面。
<?php
session_start();
if(isset($_SESSION['indicator']))
{
/*
dont do anything because session indicator says
that the processing was already done..
you might want to redirect to a new url here..
*/
}
else
{
/*
first set session indicator so that subsequent
process requests will be ignored
*/
$_SESSION['indicator'] = "processed";
//process the request here..
}
?>
在您重定向到的页面中,取消设置会话var,以便可以重新重新提交表单,使其成为新的后期操作。这将允许新的表单帖子,但会因页面刷新而阻止后期操作
答案 1 :(得分:3)
使用中间页面执行操作,然后重定向。
例如:
mypage.php - &gt;带有
形式的页面dostuff.php - &gt;接收表单数据并进行操作,然后重定向到任何其他页面。
要进行重定向:
将此行放在“dostuff.php”的顶部:header("Location: mypage.php");
答案 2 :(得分:2)
您面临的问题可以(并且应该)通过Post/Redirect/Get来解决。在PHP端取消设置_POST
将无效,因为问题是它是一个单独的请求。
您还必须双击提交按钮。您可以在客户端通过在单击按钮后禁用表单提交,或者在表单中放置随机令牌并将该令牌存储在会话中来解决此问题。该令牌仅被接受一次(会话记录该令牌是否已被发布)。
答案 3 :(得分:2)
使用此代码
if(isset($_POST)){
header('location:'.$_SERVER['PHP_SELF']);
die();
}
答案 4 :(得分:1)
这是一个很好的方法,用于阻止用户两次提交相同的数据,这也会阻止页面在重新加载时向数据库添加相同的记录。
// First IF
if ($_SESSION['dup_comment_body'] == $_POST['comment_body']) {
echo 'You already entered that.';
} else {
// Second IF
if ($_POST['comment_body']) {
// Run your query here
$_SESSION['dup_comment_body'] = $_POST['comment_body'];
header('location:'.$_SERVER['REQUEST_URI'].'');
}
}
第一次IF
检查$_POST
是否等于他们输入的最后一件事($_SESSION
)。如果它不相同,则运行下一个IF
来测试$_POST
变量是否为空。在最后IF
的底部,它将$_SESSION['dup_comment_body']
设置为等于$_POST
。因此,下次第一次IF
运行且$_POST
相同时,他们会收到消息“您已输入该内容。”。希望这有帮助!
答案 5 :(得分:0)
如果您的表单将要更新数据库,则仅当记录不存在时才可以更新或插入。只需先执行一条select语句。这样可以防止由于刷新而重复记录。
答案 6 :(得分:0)
如果要将此表单的内容插入数据库,只需使用php / sql SELECT语句来检查“用户名”是否已提交。如果是,则抛出错误。像这样:
//Database Values: servername, dbname, username and password;
//Also set ($_POST['username']) = $username or anything you like;
$usererror = ""; //Will be filled later.
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt1 = $conn->prepare("SELECT * FROM yourdb WHERE username=:username");
$stmt1->bindParam(':email', $email);
$stmt1->execute();
$stmt1->fetch();
$querycheck = $stmt1->rowCount();
if ($querycheck >= 1) {
$usererror = "User already exists.";
}
}
catch(PDOException $e) {
// roll back the transaction if something failed
$conn->rollback();
echo "Critical Error. Contact admin immediately.";
error_log("Error: " . $e->getMessage(), 0); //logs connection errors instead of echoing the errors (for security reasons.)
}
$conn = null;
然后您现在只能插入没有错误的表格:
If (empty($usererror)) {
//insert command
}
注意,我使用了准备好的语句,因为在许多文章中,据说这是使用php + sql在数据库上进行操作的最安全的方法。如果您确实没有安全问题,也可以使用常规方法,这样也可以节省更多代码行。
还要注意 $ querycheck> = 1 ,即使用户刷新2,000次,单击“后退”按钮并再次提交等,确保1次插入且不超过1次也是非常重要的。错误令我束手无策并使我发疯了好几天的原因是使用 $ querycheck> 1 而不是 $ querycheck> = 1 ,这样,我的表单在提交“已经存在”错误。最后,我已经能够修复它。希望这对以后会问这个问题的人有所帮助。
答案 7 :(得分:0)
您可以在处理表单数据后重置 $_POST 数组,例如如下代码
<?php
if( isset($_POST['submit']))
{
//do some processing related to form;
//after done.....
$_POST = array(); //this declares post as empty array
//which is global variable anyways.
}
?>
或者第二种方式是使用隐藏表单的东西....
<?php
if( isset($_POST['submit']))
{
//do some processing related to form;
//create a form with hidden field
?>
<form method="post" name="myform" action="actionpage">
<input type="hidden" name="somename" value="">
</form>
<?php
echo "<script> document.forms['myform'].submit();</script>";
}
?>
这基本上会提交带有 1 个空值字段的表单,我不知道这是否是最佳的,但它满足了这里的需要。
答案 8 :(得分:-1)
您需要使用POST/REDIRECT/GET pattern。
Post / Redirect / Get(PRG)是一种Web开发设计模式,可以防止一些重复的表单提交,为用户代理(用户)创建更直观的界面。 PRG以可预测的方式支持书签和刷新按钮,不会创建重复的表单提交。
当通过HTTP POST请求将Web表单提交给服务器时,尝试刷新某些用户代理中的服务器响应的Web用户可能会导致重新提交原始POST请求的内容,从而可能导致意外结果,例如重复的网络购买。
为避免此问题,许多Web开发人员使用PRG模式 - 而不是直接返回网页,POST操作返回重定向命令。 HTTP 1.1规范引入了HTTP 303(“请参阅其他”)响应代码,以确保在这种情况下,Web用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始POST请求。但是,目前使用的最常见的商业应用程序(新旧相似)在这些情况下仍然会继续发出HTTP 302(“Found”)响应。
以下是PHP中的一个示例:
header('Location: /yourpage.php', true, 303);
exit;
答案 9 :(得分:-1)
我的解决方法是在设置post变量时进行元刷新,$ _POST在刷新后不跟随它。
<head>
<?php
if (isset($_POST['Task'])){
echo' <meta http-equiv="refresh" content="0; url=./ThisFile.php">';
}
?>
</head>
答案 10 :(得分:-2)
相反,你可以使用像Recaptcha这样的验证码,它不允许在不进行验证码的情况下提交帖子。这就是我使用的,它完美无缺。