我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
当前回答
您可以通过会话变量防止表单重新提交。
首先,你必须在文本框中设置rand(),并在表单页面上设置$_SESSION['rand']:
<form action="" method="post">
<?php
$rand=rand();
$_SESSION['rand']=$rand;
?>
<input type="hidden" value="<?php echo $rand; ?>" name="randcheck" />
Your Form's Other Field
<input type="submit" name="submitbtn" value="submit" />
</form>
在此之后,检查$_SESSION['rand']与文本框$_POST['randcheck']值 是这样的:
if(isset($_POST['submitbtn']) && $_POST['randcheck']==$_SESSION['rand'])
{
// Your code here
}
确保在使用session_start()的每个文件上都启动会话。
其他回答
基本上,你需要重定向出该页面,但它仍然可以使一个问题,而你的互联网缓慢(重定向头从服务器端)
基本场景示例:
点击提交按钮两次
解决方法
客户端 一旦客户端点击它,禁用提交按钮 如果你使用Jquery: Jquery.one PRG模式 服务器端 使用基于差分的哈希时间戳/发送请求时的时间戳。 Userequest令牌。当主进程加载完成时,分配一个临时请求标记,如果重复则忽略该标记。
你真的应该使用Post Redirect Get模式来处理这个问题,但如果你在某种程度上陷入了PRG不可行的境地(例如,表单本身在一个include中,防止重定向),你可以散列一些请求参数,根据内容生成一个字符串,然后检查你是否已经发送了它。
//create digest of the form submission:
$messageIdent = md5($_POST['name'] . $_POST['email'] . $_POST['phone'] . $_POST['comment']);
//and check it against the stored value:
$sessionMessageIdent = isset($_SESSION['messageIdent'])?$_SESSION['messageIdent']:'';
if($messageIdent!=$sessionMessageIdent){//if its different:
//save the session var:
$_SESSION['messageIdent'] = $messageIdent;
//and...
do_your_thang();
} else {
//you've sent this already!
}
我使用这个javascript行来阻止弹出窗口要求表单重新提交刷新一旦表单提交。
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
只需将这一行放在文件的页脚,就能看到神奇的效果
一个非常可靠的方法是在post中实现一个唯一的ID,并将其缓存到
<input type='hidden' name='post_id' value='".createPassword(64)."'>
然后在你的代码中这样做:
if( ($_SESSION['post_id'] != $_POST['post_id']) )
{
$_SESSION['post_id'] = $_POST['post_id'];
//do post stuff
} else {
//normal display
}
function createPassword($length)
{
$chars = "abcdefghijkmnopqrstuvwxyz023456789";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= ($length - 1)) {
$num = rand() % 33;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
使用头和重定向页面。 标题(“位置:your_page.php”);您可以重定向到相同的页面或不同的页面。 将$_POST插入数据库后取消设置。 设置($ _POST);