重复提交表单怎么解决php+mysql
用php5写了个留言的表单,工作正常,但是接F5键刷新时,它又把表单提交一遍,这样留言就重复了.查了一下,好象说用session可以解决,但是弄了半天,还是没弄好,请指教,下面是我的代码:
<form action="<?php echo $_SERVER['PHP_SELF']?> " method="POST">
<br>留言:<br>
<textarea rows="7" cols="35" name="liuyan_comment"></textarea>
<br>
昵称:<br>
<input type="text" name="liuyan_name">
<input type="submit" value="submit">
</form>
<?php
//$liuyan_name=htmlentities($_REQUEST['liuyan_name']);此句不能显示中文
$liuyan_name=$_REQUEST['liuyan_name'];
$liuyan_comment=$_REQUEST['liuyan_comment'];
$time=date(DATE_ISO8601);
$tmp_date=explode("T",$time);
$tmp_time=explode("+",$tmp_date);
$time=$tmp_date." ".$tmp_time;
$mysql_link=@mysql_connect("localhost","liuyan","liuyanadmin");
if(!$mysql_link)
{
echo "Sorry, can not connect to mysql\n";
die();
}
mysql_select_db("liuyandb");
$boolval = $_REQUEST['liuyan_comment']!="" && $_REQUEST['liuyan_name']!="" ;
if($boolval)
{
$liuyan_query="INSERT INTO liuyan20060405 (datetime,name,comment) VALUES('$time','$liuyan_name','$liuyan_comment')";
mysql_query($liuyan_query);
}
//$userLastAction=$liuyan_name;
$query = 'select * from liuyan20060405 order by id desc';
$result=mysql_query($query);
echo "<table>\n";
while($line=mysql_fetch_array($result,MYSQL_ASSOC)){
echo "\t<tr>\n";
foreach($line as $col_value){
echo "\t\t<td>$col_value</td>\n";
}
echo "\t</tr>\n";
}
echo "</table>\n";
mysql_free_result($result);
mysql_close($mysql_link);
//echo "<br>";
//echo date(DATE_ISO8601);
?> 你可以做一个网页处理留言,之后自动刷新转回。
就是:
发留言页面 -> 你的留言已保存,浏览器自动刷新 -> 留言查看页面或者回到发留言的地方 顺着这个思路,就是让这个网页重新载入一遍,我采用了这个方法,但是未彻底解决问题,虽然留言不会重复记录到数据库里了,但是按F5时,还是问你要不要提交表单,我的意图是按F5时,就简简单单的刷新一遍,而不要提问是不是要提交什么已经过期的表单内容.
暂时就这样放着吧,只要它不影响我的数据库记录就可以了,以后再慢慢弄它吧.
暂时采取的措施是:
在这段代码中加入一个echo语句
以前的:
if($boolval)
{
$liuyan_query="INSERT INTO liuyan20060405 (datetime,name,comment) VALUES('$time','$liuyan_name','$liuyan_comment')";
mysql_query($liuyan_query);
}
修改过后的:
if($boolval)
{
$liuyan_query="INSERT INTO liuyan20060405 (datetime,name,comment) VALUES('$time','$liuyan_name','$liuyan_comment')";
mysql_query($liuyan_query);
echo "<html><head><meta http-equiv=\"refresh\" <meta http-equiv=\"refresh\" content=\"0;url=/\"> </head><body></body></html>";
} session在服务器端生成一串随机字符,然后在前端呈现给用户(以图片的形式)
当用户提交时,必须输入匹配字符,否则不能提交表单的内容
既便用户刷新了客户端,但是服务器端的session会随机变化,当不匹配时就不插入数据
这也是防止暴力破解、洪水攻击的方法 解决方法是这样的, 在你表单提交之后, 程序处理完毕, 需要给浏览器发送一个 http redirect (重定向) 的 response, 这样浏览器就会直接重定向到指定页面 (比如你的留言列表页), 这时, 摁 F5 刷新页面只是相当于把留言列表页再请求一次 (正确的行为), 而非把表单重新提交一次. cool,
thanks.
if (创建留言) {
$tpl->smarty->assign(array(
"js_msg" => "if(window.confirm('" . $language["post_succeed"] . "')) {location.href=\"module.php?module=msg&action=listview\"}"
)
);
} else {
$tpl->smarty->assign(array(
"js_msg" => "alert('" . $language["create_fail_js_msg"] . "')"
)
);
}
页:
[1]