`

PHP防止用户刷新页面,重复提交表单内容

阅读更多
PHP Version 5.0.3RC2

通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容。在PHP里如何避免这点?

弯路:
由于表单变量的内容由$_POST['name']引用,也许在处理完表单后,直接将$_POST['name']销毁(unset())即可。其实不然。
可能由于页面默认对表单内容进行了缓存,所以,即使销毁了$_POST['name'],刷新后,$_POST['name']还是会被赋值,一样有效。

解决:
利用PHP的Session。Session保存在服务器端,在PHP过程中改变Session变量的值后,即保存在服务器端,下次访问这个变量时,得到是新赋的值,所以,可以用一个Session变量记录表单提交的次数,大于1时,就不在处理表单中的数据。

if (isset($_POST['action']) && $_POST['action'] == 'submitted') {
      session_start();
      isset($_SESSION['submit_time']) or die ("no session");
      if ($_SESSION['submit_time']==0){
              print '<pre>';
      
              print_r($_POST);
              print '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>';
      
              print '</pre>';
              $_SESSION['submit_time']=1;
              echo $_SESSION['submit_time'];
      } else {
              print '<pre>';
      
              print_r($_POST);
              echo "However you have submitted";
              print '</pre>';
      }
} else {
      session_start() or dir("session is not started");
      $_SESSION['submit_time']= 0; 
//        isset($_SESSION['submit_time']) or die ("session var is not created");
//        echo $_SESSION['submit_time'];
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  Name:  <input type="text" name="personal[name]"><br>
  Email: <input type="text" name="personal[email]"><br>
  Beer: <br>
  <select multiple name="beer[]">
      <option value="warthog">Warthog</option>
      <option value="guinness">Guinness</option>
  </select><br>
  <input type="hidden" name="action" value="submitted">
  <input type="submit" name="submit" value="submit me!">
</form>
<?php
}
?> 
上面的代码可以实现期望的功能,缺点是,没有明确销毁Session,这样,可能造成服务器上失效的Session文件依然保留。
分享到:
评论
1 楼 fei441544558 2011-01-28  
    isset($_SESSION['submit_time']) or die ("no session"); 
    if ($_SESSION['submit_time']==0){ 

              print '<pre>'; 
       
              print_r($_POST); 
              print '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>'; 
       
              print '</pre>'; 
              $_SESSION['submit_time']=1; 
              echo $_SESSION['submit_time']; 
      }

以上代码改为下面,就可以解决服务器上失效的Session:

      if (isset($_SESSION['submit_time']) && $_SESSION['submit_time']==0){ 
              print '<pre>'; 
       
              print_r($_POST); 
              print '<a href="'. $_SERVER['PHP_SELF'] .'">Please try again</a>'; 
       
              print '</pre>'; 
              $_SESSION['submit_time']=1; 
              echo $_SESSION['submit_time']; 
              unset($_SESSION['submit_time']);
      }

相关推荐

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

    PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在...

    php防止恶意刷新与刷票的方法

    点连接或者表单进入页面后,判断session中的验证码是不是与用户提交的相同,如果相同,则处理,不相同则认为是重复刷新。 在处理完成后将重新生成一个验证码,用于新页面的生成 PHP实现代码如下: 复制代码 代码

    php中防止恶意刷新页面的代码小结

    点连接或者表单进入页面后,判断session中的验证码是不是与用户提交的相同,如果相同,则处理,不相同则认为是重复刷新。 在处理完成后将重新生成一个验证码,用于新页面的生成 代码 复制代码 代码如下: &lt;?php ...

    PHP程序开发范例宝典III

    实例031 不提交表单获取单选按钮的值 43 实例032 选中单选按钮后显示其他表单元素 44 实例033 根据数据表结构自动生成数据录入页面 45 实例034 投票系统中单选按钮与复选框的应用 47 2.3 下拉列表的应用 ...

    JavaScript网页特效范例宝典源码

    实例080 防止表单重复提交 124 实例081 自动提交表单 125 实例082 通过for循环获取表单元素的中文名称 126 实例083 可以提交到不同处理页的表单 127 第3章 实用JavaScript函数 129 3.1 数据验证 130 实例084 通过...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例172 不提交表单获取单选按钮的值 207 实例173 实现复选框中的全选、反选和不选 208 实例174 隐藏域提交用户的ID值 210 实例175 图像域替代提交按钮 211 实例176 跳转菜单实现页面跳转 213 实例177 上传图片预览 ...

    超实用的jQuery代码段

    2.22 防止单个页面重复提交按钮 2.23 取得列表控件选中的option对象 2.24 限制输入框仅接受特殊字符的输入 2.25 禁止页面内全部超链接 2.26 实现动态组合列表框 2.27 如何使用属性过滤器 2.28 如何测试某个元素是否...

    帝国下载系统 v2.5 开源正式版 bulid 090613.rar

    68、新增模板变量,可以在页面共同内容的地方使用,只要修改变量内容就可以更改所有显示内容。 69、列表模板新增时间格式及软件名截取设置。 70、内容模板新增时间显示格式设置。 71、分类导航页面新增每行显示、...

    帝国下载系统 v2.5 开源正式版 bulid 090613

    68、新增模板变量,可以在页面共同内容的地方使用,只要修改变量内容就可以更改所有显示内容。 69、列表模板新增时间格式及软件名截取设置。 70、内容模板新增时间显示格式设置。 71、分类导航页面新增每行显示、...

    帝国下载系统 v2.5 开源正式版 bulid 090416.rar

    68、新增模板变量,可以在页面共同内容的地方使用,只要修改变量内容就可以更改所有显示内容。 69、列表模板新增时间格式及软件名截取设置。 70、内容模板新增时间显示格式设置。 71、分类导航页面新增每行显示、...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

    ExtAspNet_v2.3.2_dll

    -为按钮增加DisableControlBeforePostBack属性 - 回发之前是否禁用按钮,防止重复提交 - 默认为true。 -Grid的Values属性访问限制由internal改为public,这就意味这可以自由改变Grid中每个单元格的值了。 -增加...

    UWA 2.X 通用建站系统 v2.1.0

    [增强]修复表单提交时 uploadify 是否正在上传附件判断 [增强]一键更新 [修正]修复地址拼装函数Url::U() [增强]完善缓存清除记录,优化缓存清除过程 [修正]完善会员中心档案链接预览 [修正]完善上传类AUpload获取...

Global site tag (gtag.js) - Google Analytics