我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
当前回答
Moob帖子的精炼版。创建POST的散列,将其保存为会话cookie,并比较每个会话的散列。
// Optionally Disable browser caching on "Back"
header( 'Cache-Control: no-store, no-cache, must-revalidate' );
header( 'Expires: Sun, 1 Jan 2000 12:00:00 GMT' );
header( 'Last-Modified: ' . gmdate('D, d M Y H:i:s') . 'GMT' );
$post_hash = md5( json_encode( $_POST ) );
if( session_start() )
{
$post_resubmitted = isset( $_SESSION[ 'post_hash' ] ) && $_SESSION[ 'post_hash' ] == $post_hash;
$_SESSION[ 'post_hash' ] = $post_hash;
session_write_close();
}
else
{
$post_resubmitted = false;
}
if ( $post_resubmitted ) {
// POST was resubmitted
}
else
{
// POST was submitted normally
}
其他回答
$_POST['submit']变量在页面初始加载时不存在,并且只有在以下条件为真时才可以运行curl。
if($_POST['submit'] == "submit"){
// This is where you run the Curl code and display the output
$curl = curl_init();
//clear $post variables after posting
$_POST = array();
}
如何防止php表单重新提交没有重定向。如果你正在使用$_SESSION(在session_start之后)和$_POST表单,你可以这样做:
if ( !empty($_SESSION['act']) && !empty($_POST['act']) && $_POST['act'] == $_SESSION['act'] ) {
// do your stuff, save data into database, etc
}
在你的html表单中放这个:
<input type="hidden" id="act" name="act" value="<?php echo ( empty($_POST['act']) || $_POST['act']==2 )? 1 : 2; ?>">
<?php
if ( $_POST['act'] == $_SESSION['act'] ){
if ( empty( $_SESSION['act'] ) || $_SESSION['act'] == 2 ){
$_SESSION['act'] = 1;
} else {
$_SESSION['act'] = 2;
}
}
?>
因此,每当表单提交时,都会生成一个新的行为,存储在会话中并与后行为进行比较。
Ps:如果你正在使用一个Get表单,你可以很容易地用Get更改所有POST,它也可以工作。
处理表单时,重定向到另一个页面:
... process complete....
header('Location: thankyou.php');
您也可以重定向到同一页面。
如果您正在做一些类似评论的事情,并且希望用户停留在相同的页面上,您可以使用Ajax来处理表单提交
为什么不直接使用$_POST['submit']变量作为逻辑语句来保存表单中的任何内容呢?你总是可以重定向到相同的页面(以防它们刷新,当它们在浏览器中点击返回时,submit post变量将不再被设置。只要确保你的提交按钮有一个名称和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()的每个文件上都启动会话。