当前位置:  编程技术>php
本页文章导读:
    ▪解析php防止form重复提交的方法       php 防止表单重复提交实例: 代码如下:<?php session_start(); $_SESSION['fsess']=($_SESSION['fsess'])?$_SESSION['fsess']:time();?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/.........
    ▪PHP以指定字段为索引返回数据库所取的数据数组       很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码。所以,在完成每个新项目的时 候,适当的做些项目总结、代.........
    ▪php设计模式之单例、多例设计模式的应用分析       单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量。如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化。基于Singleton的特性,我们经常用Sin.........

[1]解析php防止form重复提交的方法
    来源: 互联网  发布时间: 2013-11-30

php 防止表单重复提交实例:

代码如下:

<?php
 session_start();
 $_SESSION['fsess']=($_SESSION['fsess'])?$_SESSION['fsess']:time();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>防止表单重复提交</title>
<SCRIPT language=Javascript type=text/javascript>
<!--
//*****Javascript防重复提交************
var frm_submit=false;   //纪录提交状态
function check_form(fobj) {
 var error = 0;
    var error_message = "";
 if (fobj.formtext.value=="")
 {
  error_message = error_message + "formtext 不能为空.\n";
  error = 1;
 }

 if (frm_submit==true) {
  error_message = error_message + "这个表单已经提交.\n请耐心等待服务器处理你的请求.\n\n";
  error=1;
 }

 if (error == 1) {
   alert(error_message);
   return false;
 } else {
   frm_submit=true;  //改变提交状态
   return true;
 }
}
-->
</script>
</head>
<body>
Javascript和服务器端 双重防止表单重复提交演示
<br/>
<br/>
现在时间:<?php echo date("Y-m-d H:i:s"); ?>
<br/>
<br/>
<?php
if(@$_POST["faction"]=="submit"||@$_GET["faction"]=="submit"){
 //提交处理

 //*****服务器端防重复提交*******************
 //如果POST传来的表单生成时间与SESSION保存的表单生成时间
 //相同;为正常提交
 //不相同;为重复提交
 if($_SESSION["fsess"]==$_POST["fpsess"]){
  $_SESSION["fsess"]=time();
  echo  "提交内容:<br/>\n";
  echo  $_POST["fpsess"]."<br/>\n";;
  echo  $_POST["formtext"];
  echo "</body></html>";
  exit;
 } else {
  echo  "重复提交,退出!!!!<br/>\n";
  echo "</body></html>";
  exit;
 }
}
//$_SESSION["fsess"]=time();
?>
<form name="f_info" action="" method="post"  onSubmit="return check_form(this);">
<input name="fpsess" type="hidden" value="<?php echo $_SESSION["fsess"]; ?>" />
<!-- 保存表单生成时间 -->
<input name="faction" type="hidden" value="submit" />
<input name="formtext" id="formtext" type="text" value="" />
<input type="submit" value="提交" />
<input  type="reset" value="重置" />
</form>
</body>
</html>

*************************************************************
上面是完整例题,下面是在网站摘抄,仅供参考
*************************************************************
用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。

1.使用客户端脚本
提到客户端脚本,经常使用的是JavaScript进行常规输入验证。在下面的例子中,我们使用它处理表单的重复提交问题,请看下面的代码:
<form method="post" name="register" action="/blog_article/test.html" 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()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:

代码如下:

<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。
缓存指令
说    明
public
指示响应可被任何缓存区缓存
private
指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效
no-cache
指示请求或响应消息不能缓存
no-store
用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存
max-age
指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应
min-fresh
指示客户机可以接收响应时间小于当前时间加上指定时间的响应
max-stale
指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息

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);
?>


    
[2]PHP以指定字段为索引返回数据库所取的数据数组
    来源: 互联网  发布时间: 2013-11-30
很多情况下,我们从接触一个新的项目到开发完成,再回过头来仔细浏览一下自己写的代码,很多都是我们以前用熟练的代码。所以,在完成每个新项目的时 候,适当的做些项目总结、代码总结,或许你会在以后的项目中用得着,极有可能获得意外的收获,比如:代码优化,想到了更好、速度更快的实现方法等等。

牛逼的程序开发者有时候不在于代码量的多少,而是程序的代码简洁性、逻辑复杂但实现的方便性,这些才说明是否是一位好的程序员。我们不做日夜加班到深夜,拼代码量的程序员!
这篇和大家分享几个使用得PHP编程技巧,有些技巧是在看别人代码的时候学来的,有些是自己总结的。

以特定字段为索引,返回数据库取的数据数组
举个例子容易些:
假如你要统计指定站点从其它网站来的流量情况,并且做一个小后台,查看每个网站每天带来的流量情况。我们先建2张数据表:
表一、站点配置表(只统计这些网站的流量)
代码如下:

CREATE TABLE `site_config` (
`id` smallint(5) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`site_url` varchar(128) NOT NULL COMMENT '网站URL地址',
`site_name` varchar(80) NOT NULL COMMENT '网站名称',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`),
UNIQUE KEY `adid` (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='站点配置表';

表二、站点流量统计表(来一个用户一条记录)
代码如下:

CREATE TABLE `site_stat` (
`id` int(11) unsigned NOT NULL auto_increment COMMENT '主键,自增',
`sid` smallint(5) unsigned NOT NULL COMMENT '网站ID',
`ip_address` varchar(32) NOT NULL COMMENT '用户IP',
`add_time` timestamp NOT NULL default CURRENT_TIMESTAMP COMMENT '添加时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='站点流量统计表' ;

因为site_config表读操作大于写操作,所以类型设置为MyISAM;而site_stat表写操作大于读操作,因此,我把表类型设置为InnoDB。(这些地方也是你在设计数据的时候需要考虑的,速度提高不少)。
回到正题,假如表site_config里有这样几条数据:
数据格式为:id,sid,site_url,add_time
1,200,baidu.com,2013-06-30 14:20:00
2,201,google.com,2013-06-30 14:20:00
3,202,cnblogs.com,2013-06-30 14:20:00
4,203,codejia.net,2013-06-30 14:20:00
站点流量统计表site_stat里已经产生了一些数据,如下:
数据格式为:id,sid,ip_address,add_time
1,200,167.87.32.4,2013-06-30 14:40:00
2,200,192.168.11.56,2013-06-30 14:40:10
3,202,167.87.32.4,2013-06-30 14:40:10
4,202,192.168.11.56,2013-06-30 14:40:20
5,203,167.87.32.4,2013-06-30 14:40:20
6,202,10.10.10.10,2013-06-30 14:40:30
7,200,167.87.32.4,2013-06-30 14:40:31
你在后台需要做的报表格式为:日期,网站ID,网站URL,流量数 (没有流量的站点也要展示,流量显示为0)
你可能会想到根据日期,在表site_stat里根据sid group by之后再left join表site_config,这显然不是我将分享的方法。
用2条SQL来搞定,一条是取所有的站点;另一条是取指定日期下站点流量统计数。

SQL1取所有站点:
代码如下:

SELECT sid,site_url,site_name FROM site_config

SQL2取站点统计(假如为今天):
代码如下:

SELECT sid,COUNT(1) AS come_total FROM site_stat
WHERE add_time>='2013-06-30 00:00:00'
AND add_time<='2013-06-30 23:59:59'
GROUP BY sid

前面说了一大堆都是为后面做铺垫,分享一个PHP以传过去的字段为索引,返回二维数组的方法:
代码如下:

protected function getList($sql,$filed = null){
$res = mysql_query($sql,$this->link_sc);
$data = array();
if($filed === null){
while($row = mysql_fetch_assoc($res)){
$data[] = $row;
}
}else{
while($row = mysql_fetch_assoc($res)){
$data[$row[$filed]] = $row;
}
}
return $data;
}

把你的SQL传进入,并把需要索引的字段传进入就OK,前提是传进去的字段必须要在select返回的字段里。
我们在取所有站点的时候不需要传过去字段,但在取站点流量统计的时候我们把,站点sid传过去,即如下:
代码如下:

$sites = getList($sql1); //所有站点
$data = getList($sql2,'sid'); //站点流量数据,以sid为索引返回二维数组

最后在展示报表的时候,用foreach循环$sites,取流量的时候到数组$data里去取索引为sid的数据就OK了。
非常方便,并且非常容易掌握,我就经常这么干。

最后看下上表的统计结果报表:
格式为:日期,网站ID,网站URL,流量数
2013-06-30,200,baidu.com,3
2013-06-30,201,google.com,0
2013-06-30,202,cnblogs.com,3
2013-06-30,203,codejia.net,1
总结:貌似写这么多就说明那样一个小的技巧哈,但是,可千万别小看这个技巧,能节约你很多时间。所以,大家在写代码的时候多多总结,多多来博客园和大家交流、学习,编程水平一定会进步很快的!

    
[3]php设计模式之单例、多例设计模式的应用分析
    来源: 互联网  发布时间: 2013-11-30
单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量。如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化。

基于Singleton的特性,我们经常用Singleton配置应用程序并定义应用程序中可能随时访问的变量。但有时并不推荐使用Singleton,因为它生成了一个全局状态且

该单一根对象没有封装任何系统功能。多数情况下,会使单元测试和调试变得困难。读者根据情况自行决定。
代码示例:
代码如下:

<?php
class SingletonExample{
    private function __construct(){}//防止直接实例化
  public static function getInstance(){ //不与任何对象有关联
 static $instance=null;    //调用此函数的所有代码共享该变量,不必要让其是类的静态变量
 if($instance==null){
   $instance=new SingletonExample();
     }
   return $instance;
  }
}
$obj1=SingletonExample::getInstance();
$obj2=SingletonExample::getInstance();
var_dump($obj1===$obj2);// true   是同一个实例
?>

Multiton与singleton相似,不同的是后者需要getInstance()函数传递关键值。
对于给定的关键值只会存在唯一的对象实例,如果有多个节点,每个节点拥有唯一的表识符,且各个节点在某单次执行(如cms里的节点)可能出现多次,那么就可以用Multiton模式实现这些节点啊,Multiton节省内存,并确保同一个对象的多个实例不发生冲突.
示例:
代码如下:

 <?php
 class MultitonExample{
 private function __construct(){}//防止直接实例化

   public static function getInstance($key){
  static $instance=array();   
  if(!array_key_exists($key,$instance)){
    $instance[$key]=new SingletonExample();
      }
    return $instance($key);
   }
 };
 ?>

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3