多数大学生出来选择的工作和专业无关
首页 > 专业知识

探讨PHP表单重复提交的预防法则

时间:2018-12-17 20:31:22 [来源]:郑州PHP培训学校

   探讨PHP表单重复提交的预防法则

  PHP表单重复提交的预防方法有很多种,我们可以使用客户端JS脚本;使用Cookie处理;使用Session处理和使用header函数转向莱解决这一问题。
  PHP表单在提交的过程中经常会遇到重复提交的问题。那么,今天我们就为大家介绍有关PHP表单重复提交的避免方法。这两天在考虑关于PC端的避免表单重复提交和页面刷新,导致数据库重复操作的情况处理。
  现在罗列一下,关于避免PHP表单重复提交的常用几种常规方案,以下是源码:
  1.使用客户端JS脚本
  提到客户端脚本,经常使用的是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>
  当用户单击“提交”按钮后,该按钮将变为灰色不可用状态。
  上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。
  还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:
  < input type="hidden" name="originator" value="<?=$code?>">
  在接收页面的PHP代码如下:
  < ?phpsession_start();if(isset($_POST['originator'])) {if($_POST['originator'] == $_SESSION['code']){// 处理该表单的语句,省略}else{
  echo ‘请不要刷新本页面或重复提交表单!’;}
  }?>
  在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将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,该方法将不起任何作用,这点请注意。
  3.使用Session处理
  利用PHP的Session功能,也能避免PHP表单重复提交。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 ‘请不要刷新本页面或
  重复提交表单!’;
  }
  }?>
  4.使用header函数转向
  除了上面的PHP表单重复提交的预防方法之外,还有一个更简单的方法,那就是当用户提交表单,服务器端处理后立即转向其他的页面,代码如下所示。
  if (isset($_POST['action'])
  && $_POST['action'] == 'submitted') {
  //处理数据,如插入数据后,立即转向到其他页面header('location:submits_success.php');
  }
  以上就是PHP表单重复提交的几个预防方法的介绍。
  PHP表单数组的具体使用方法介绍
  对于初学PHP语言的人来说,PHP表单数组也许还是比较陌生的。在接下来的文章中我们将会为大家详细解读这一方面的知识,希望对大家有所帮助。
  今天我们将要为大家介绍的是有关PHP表单数组的相关知识,这对于初学PHP语言的朋友来说应该会有一定的帮助,希望大家能够对此有一个深刻的理解。
  编码的时候遇到一个问题。WP插件的Options表单,可以定义一些表单值变量,WP直接帮我们处理、保存和修改表单提交的内容,无需自己处理任何$_POST。但是如果我要提交的表单内容是一个动态变化的数组怎么办?例如表单是一个动态生成的inputbox列表,如何不用$_POST直接将这些数据打包成一个数组变量传给WP呢?
  突然想到了PHP表单数组:
  < input name="a[]" value="1" />
  < input name="a[]" value="2" />
  < input name="a[]" value="3" />
  $_POST结果为:
  Array
  (
  [a] => Array
  (
  [0] => 1
  [1] => 2
  [2] => 3
  )
  )
  那么如果这样命名表单:
  < input name="a[2]" value="1" />
  < input name="a[5]" value="2" />
  < input name="a[9]" value="3" />
  $_POST输出结果为:
  Array
  (
  [a] => Array
  (
  [2] => 1
  [5] => 2
  [9] => 3
  )
  )
  恩恩,继续测试PHP表单数组:
  < input name="a[aa]" value="1" />
  < input name="a[bb]" value="2" />
  < input name="a[cc]" value="3" />
  $_POST输出结果为:
  Array
  (
  [a] => Array
  (
  [aa] => 1
  [bb] => 2
  [cc] => 3
  )
  )
  然后测试多维数组,也成功了。哇,简直太酷了!
  一个动态生成的PHP表单数组,不依靠Javascript,就可以将很多数据仅仅以一个数组变量的方式提交上去,解决了开发这个小WordPress插件的大麻烦。
  深入剖析PHP变量的具体使用方法
  PHP变量包括有静态变量,全局变量,超全局变量等。当我们向给变量赋值时,可以采用传地址赋值的方法。
  我们在使用PHP进行实际编码的过程中,经常会遇到变量处理方面的问题。在接下来的文章中,我们将重点为大家介绍PHP变量的具体使用方法。
  PHP变量1.定义常量define("CONSTANT", "Hello world.");常量只能包含标量数据(boolean,integer,float 和 string)。
  调用常量时,只需要简单的用名称取得常量的值,而不能加“$”符号,如:echo CONSTANT;注: 常量和(全局)变量在不同的名字空间中。这意味着例如 TRUE 和 $TRUE 是不同的。
  PHP变量2.普通变量$a = "hello";
  PHP变量3.可变变量(使用两个美元符号($))$$a = "world";
  两个变量都被定义了:
  $a 的内容是“hello”并且 $hello 的内容是“world”。
  因此,可以表述为:
  echo "$a ${$a}";或者 echo "$a $hello";它们都会输出:hello world要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]。
  PHP变量4.静态变量
  在函数内部static $a = 0;
  注意:声明中用表达式的结果对其赋值会导致解析错误如static $a =3+3;(error)静态变量仅在局部函数域中存在(函数内部),函数执行完之后,变量值不会丢失,可用于递归调用PHP变量5.全局变量
  在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用,在全局范围内访问变量可以用特殊的 PHP 自定义 $GLOBALS 数组:
  如:$GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];在一个函数域内用 global 语句导入的一个真正的全局变量实际上是建立了一个到全局变量的引用global $obj;
  注:对于变量的 static 和 global 定义是以 应用 的方式实现的PHP变量6.给变量赋值:传地址赋值(简单引用):
  $bar = &$foo; //加&符号到将要赋值的变量前改动新的变量将影响到原始变量,这种赋值操作更加快速注意:只有命名变量才可以传地址赋值
  注意:如果
  $bar = &$a;
  $bar = &$foo;
  改变$bar的值只能改变变量foo的值,而不改变a的值(引用改变了)PHP变量7.PHP 超全局变量$GLOBALS :
  包含一个引用指向每个当前脚本的全局范围内有效的变量。该数组的键标为全局变量的 名称。从 PHP 3 开始存在 $GLOBALS 数组。
  $_SERVER : 变量由 Web 服务器设定或者直接与当前脚本的执行环境相关联。类似于旧数组 $HTTP_SERVER_VARS 数组(依然有效,但反对使用)。
  $_GET : 经由 HTTP GET 方法提交至脚本的变量。
  $_POST : 经由 HTTP POST 方法提交至脚本的变量。
  $_COOKIE : 经由 HTTP Cookies 方法提交至脚本的变量。
  $_FILES : 经由 HTTP POST 文件上传而提交至脚本的变量。
  文件上传表单中要有 enctype="multipart/form-data"$_ENV : 执行环境提交至脚本的变量。
  $_REQUEST :经由 GET,POST 和 COOKIE 机制提交至脚本的变量,因此该数组并不值得信任。所有包含在该数组中的变量的存在与否以及变量的顺序均按照 php.ini 中的 variables_order 配置指示来定义。该数组没有直接模拟 PHP 4.1.0 的早期版本。参见 import_request_variables()。注意: 自 PHP 4.3.0 起,$_FILES 中的文件信息不再存在于 $_REQUEST 中。
  $_SESSION :当前注册给脚本会话的PHP变量。
 

上一篇:PHP调试及性能分析工具Xdebug怎么用

下一篇:做PHP网站开发需要具备哪些技能