`

Php防止重复提交问题总结

    博客分类:
  • php
阅读更多
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

1.使用客户端脚本
提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:

<form method="post" name="register" action="test.php" enctype="multipart/form-data">

<input name="text" type="text" id="text" />

<input name="cont" value="提交" type="button" onClick="document.register.cont.value='正在提交,请等待...'; document.register.cont.disabled=true;document.the_form.submit();">

</form>

当用户单击“提交”按钮后,该按钮将变为灰色不可用状态,如图5-6所示。

上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。

还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:

<script language="javascript">

<!--

var submitcount=0;

function submitOnce (form){

if (submitcount == 0){

     submitcount++;

     return true;

} else{

    alert("正在操作,请不要重复提交,谢谢!");

    return false;

}

}

//-->

</script>

<form name="the_form" method="post" action="" onSubmit="return submitOnce(this)">

<input name="text" type="text" id="text" />

<input name="cont" value="提交" type="submit">

</form>

在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。

2.使用Cookie处理
使用Cookie记录表单提交的状态,根据其状态可以检查是否已经提交表单,请见下面的代码:

<?php

if(isset($_POST['go'])){

    setcookie("tempcookie","",time()+30);

    header("Location:".$_SERVER[PHP_SELF]);

    exit();

}

if(isset($_COOKIE["tempcookie"])){

    setcookie("tempcookie","",0);

    echo "您已经提交过表单";

}

?>

如果客户端禁止了Cookie,该方法将不起任何作用,这点请注意。关于Cookie的详细介绍,请参阅第10章“PHP会话管理”。

3.使用Session处理
利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交,请见如下代码:

<?php

    session_start();

    //根据当前SESSION生成随机数

    $code = mt_rand(0,1000000);

    $_SESSION['code'] = $code;

?>

在页面表单上将随机数作为隐藏值进行传递,代码如下:

<input type="hidden" name="originator" value="<?=$code?>">

在接收页面的PHP代码如下:

<?php

session_start();

if(isset($_POST['originator'])) {

    if($_POST['originator'] == $_SESSION['code']){

        // 处理该表单的语句,省略

    }else{

        echo ‘请不要刷新本页面或重复提交表单!’;

    }

}

?>

关于Session的内容,我们会在第10章“PHP会话管理”详细讨论,你可以直接查阅这一章,然后再返回本节继续阅读。

4.使用header函数转向
除了上面的方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {

    //处理数据,如插入数据后,立即转向到其他页面

    header('location:submits_success.php');

}

这样,即使用户使用刷新键,也不会导致表单的重复提交,因为已经转向新的页面,而这个页面脚本已经不理会任何提交的数据了。

5.8.4 表单过期的处理
在开发过程中,经常会出现表单出错而返回页面的时候填写的信息全部丢失的情况,为了支持页面回跳,可以通过以下两种方法实现。

1.使用header头设置缓存控制头Cache-control。

header('Cache-control: private, must-revalidate'); //支持页面回跳

2.使用session_cache_limiter方法。

session_cache_limiter('private, must-revalidate'); //要写在session_start方法之前

下面的代码片断可以防止用户填写表单的时候,单击“提交”按钮返回时,刚刚在表单上填写的内容不会被清除:

session_cache_limiter('nocache');

session_cache_limiter('private');

session_cache_limiter('public');

session_start();

//以下是表单内容,这样在用户返回该表单时,已经填写的内容不会被清空

将该段代码贴到所要应用的脚本顶部即可。

Cache-Control消息头域说明
Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。

请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh和only-if- cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must- revalidate、proxy-revalidate和max-age。各个消息中的指令含义如表5-3所示。


缓存指令
说    明

public
指示响应可被任何缓存区缓存

private
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效

no-cache
指示请求或响应消息不能缓存

no-store
用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存

max-age
指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应

min-fresh
指示客户机可以接收响应时间小于当前时间加上指定时间的响应

max-stale
指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

有关Session和Cookie的介绍,详细内容请参阅第10章“PHP会话管理”。

5.8.5 判断表单动作的技巧
表单可以通过同一个程序来分配应该要处理的动作,在表单中有不同的逻辑,要怎么判别使用者按下的按钮内容不过是个小问题。

其实只要通过提交按钮的name 就可以知道了,表单在提交出去的时候,只有按下的submit类型的按钮才会被送到表单数组去,所以只要判断按钮的值就可以知道使用者按下哪一个按钮,以如下表单为例:

<FORM method="POST" Action=test.php>

<input type=submit name="btn" value="a">

<input type=submit name="btn" value="b">

</FORM>

当使用者按下“a”按钮的时候btn=a,按下“b”按钮,则btn=b。

另外也可以通过提交按钮的名字(name)来判断,请见如下代码:

<FORM method="POST" Action=test.php>

<input type=submit name="a" value="提交A">

<input type=submit name="b" value="提交B">

</FORM>

这样只要POST/GET的参数里面有a或b,就可以知道按下的按钮是哪个。

<?php

    print_r($_POST);

?>
分享到:
评论

相关推荐

    修改禁止多次重复提交

    在IT行业中,尤其是在Web开发领域,防止用户多次重复提交数据是一项重要的任务,这可以避免数据库出现冗余数据,保持系统稳定。"修改禁止多次重复提交"这个话题涉及到前端交互、后端处理以及数据库操作等多个层面。...

    php+Ajax远程加载防止重复提交

    总结,通过PHP和Ajax的结合,我们可以创建一个防止重复提交、用户体验优良的远程加载系统。这种技术在现代Web应用中被广泛应用,既能保证数据的一致性,又能提供流畅的用户体验。提供的代码文件很可能是实现这些功能...

    解析php防止form重复提交的方法

    这种方法的优点是简单易行且能够有效防止重复提交;但缺点是它依赖于客户端的时间设置,如果客户端的系统时间被恶意用户修改,则可能绕过这种防护措施。因此,更为安全的做法是仅在服务器端生成时间戳,并在表单中...

    ThinkPHP防止重复提交表单的方法实例分析

    在开发基于ThinkPHP框架的Web应用时,防止用户通过浏览器操作导致表单重复提交是一个常见问题。用户可能会点击浏览器的后退按钮或刷新页面来重复提交数据,这可能会对数据库造成重复记录或不一致的数据状态。本文将...

    php防止form重复提交

    总结来说,防止 PHP 表单重复提交可以从多个角度实现,包括客户端的 JavaScript 验证、Cookie 和 Session 管理、数据库唯一约束、Token 检验、HTTP 重定向、数据库事务以及前端的防抖和节流技术。选择哪种方法取决于...

    PHP实现防止表单重复提交功能【基于token验证】

    &lt;meta name="description" content="PHP防止重复提交表单" /&gt; &lt;!-- 隐藏的token字段 --&gt; &lt;input type="hidden" name="token" value="&lt;?php echo $_SESSION['token'];?&gt;"&gt; 我们"&gt; 提交" /&gt; &lt;?php ...

    PHP防止表单重复提交的几种常用方法汇总

    最后,使用数据库的唯一索引约束来防止重复提交是一种更加严格的措施。通过在数据库表中的关键字段上建立唯一索引,系统能够自动阻止重复数据的插入。虽然这种方法在数据库层面保证了数据的唯一性,但并不能完全代替...

    自定义标签防止表单重复提交

    在Web开发中,表单重复提交是一个常见的问题,可能导致数据不一致或服务器资源浪费。本文将深入探讨如何通过自定义标签来防止表单的重复提交,以确保数据的一致性和系统的稳定性。 首先,理解表单重复提交的问题。...

    php防止form重复提交的方法

    注意,这种方法依赖于客户端的Cookie支持,如果用户禁用了Cookie,这种方法将无法有效防止重复提交。 3. **利用Session**: Session存储在服务器端,可以用来记录表单的提交状态。创建一个随机数作为Session变量...

    防止表单重复提交的方法(简单的token方式)

    防止表单重复提交的方法(简单的token方式),内附实现代码及实现思路。

    thinkphp3.2 防止表单重复提交

    在Web开发中,防止表单重复提交是一个重要的问题,它能确保用户操作的唯一性和数据的一致性。ThinkPHP 3.2 是一个基于MVC模式的PHP开发框架,提供了丰富的功能来帮助开发者构建安全、高效的应用。在这个场景中,我们...

    php中如何防止表单的重复提交

    每种方法都有其适用场景和局限性,实际应用中通常结合使用多种方法,以提高防止重复提交的可靠性。选择哪种方法取决于具体项目的需求,如安全性、用户体验等因素。在设计系统时,应充分考虑这些因素,以确保系统的...

    PHP防止post重复提交数据的简单例子

    如果不匹配,用户将被重定向回表单页面,防止重复提交。 这个方法的一个潜在问题是,如果用户直接访问提交页面(跳过了表单页面),可能会导致授权码缺失,从而无法正常提交。为了解决这个问题,可以在表单页面之外...

    php 防止表单重复提交两种实现方法

    在某些情况下,前端解决方案可能不足以防止重复提交,特别是当使用了某些插件或库,如jQuery Validate Engine,使得无法在前端设置状态。这时,可以依赖服务器端(PHP)进行控制。 PHP可以通过检查session变量来...

    php表单加入Token防止重复提交的方法分析

    PHP表单加入Token防止重复提交的方法分析的核心在于理解Token(令牌)的使用机制,以及它如何有效地防止表单的重复提交问题。Token在Web开发中指的是一个由服务器生成的随机字符串,它具有一定的不可预测性和唯一性...

    php防止用户重复提交表单

    通过在数据库层面设置唯一索引可以避免数据的重复,但这并不是一个专门用于防止重复提交的措施,更多地是为保证数据库数据的唯一性。 4. 令牌验证。这是最常见的防止重复提交的方法之一。它通常包括在用户界面上...

    PHP+Session防止表单重复提交的解决方法

    除了上述方法,还可以使用另一种基于Token的策略来防止重复提交。在表单中添加一个隐藏的Token字段,其值存储在Session中。当表单提交时,服务器会检查提交的Token是否与Session中的值匹配。如果不匹配,则拒绝此次...

    PHP防止刷新重复提交页面的示例代码

    以下是一个简单的示例代码,展示了如何利用Session来防止重复提交: ```php &lt;?php session_start(); if (isset($_POST['action']) && $_POST['action'] == 'submitted') { // 检查是否已经提交过表单 if (isset...

Global site tag (gtag.js) - Google Analytics