zhaojt 发表于 2006-4-5 21:04:37

重复提交表单怎么解决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);
                                               
                                       
                                        ?>

jiangtao9999 发表于 2006-4-5 21:08:49

你可以做一个网页处理留言,之后自动刷新转回。
就是:

发留言页面 -> 你的留言已保存,浏览器自动刷新 -> 留言查看页面或者回到发留言的地方

zhaojt 发表于 2006-4-5 21:49:04

顺着这个思路,就是让这个网页重新载入一遍,我采用了这个方法,但是未彻底解决问题,虽然留言不会重复记录到数据库里了,但是按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>";
}

涩兔子 发表于 2006-4-5 21:52:22

session在服务器端生成一串随机字符,然后在前端呈现给用户(以图片的形式)

当用户提交时,必须输入匹配字符,否则不能提交表单的内容

既便用户刷新了客户端,但是服务器端的session会随机变化,当不匹配时就不插入数据

这也是防止暴力破解、洪水攻击的方法

Cure 发表于 2006-4-20 09:49:43

解决方法是这样的, 在你表单提交之后, 程序处理完毕, 需要给浏览器发送一个 http redirect (重定向) 的 response, 这样浏览器就会直接重定向到指定页面 (比如你的留言列表页), 这时, 摁 F5 刷新页面只是相当于把留言列表页再请求一次 (正确的行为), 而非把表单重新提交一次.

zhaojt 发表于 2006-4-22 11:50:12

cool,
thanks.

涩兔子 发表于 2006-4-22 16:00:58


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]
查看完整版本: 重复提交表单怎么解决php+mysql