PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结


Posted in PHP onMarch 07, 2012

介绍
今天发现php5.1.*和php5.2.*在数据库预编译代码执行的时候出现差异。
预编译优点
1.使用占位符,避免逐字输入数据到SQL中。自动处理引号和反斜线等字符的转义——增加安全性。
2.预先“准备”一条语句,然后在每次执行时绑定不同值达到重用的目的。——常用于以后被多次执行的语句。
3.可读性强。

代码
数据库连接代码都一样.

$protol = 'mysql:host=localhost;dbname=test'; 
$username = 'monty'; 
$passwd = '0818'; 
$dbh = new PDO($protol, $username, $passwd);

以下是一些测试。注意里面的SQL和for或者foreach语句!
测试1(用key值进行绑定)
$stmt = $dbh->prepare('select * from t1 where name=:name'); 
$params = array(); 
$params['name'] = 'rentao'; 
foreach($params as $k=>$v){ 
$stmt->bindParam($k, $v); 
} 
$stmt->execute(); 
$item = array(); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
var_dump($row); 
} 
$stmt = null; 
$dbh = null;

结论:
PHP 5.1.* PHP 5.2.*
执行正常 执行正常
$params['name'] = 'rentao' 和$params[':name']='rentao'这两个都能执行,说明不受“:”限制。
测试2(数字下标去绑定,但是绑定的起始参数是1)——":key"在php5.2.*上不能用数字下标绑定
$stmt = $dbh->prepare('select * from t1 where name=:name limit 2'); 
$params = array(); 
$params[] = 'rentao';// 这里加不加":"都能成功执行 
for($i=0,$iLen = count($params); $i < $iLen; $i++){ 
$k = $i+1; 
$stmt->bindParam($k, $params[$i]); 
} 
echo "HERE1\n"; 
$stmt->execute(); 
echo "HERE2\n"; 
$item = array(); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
var_dump($row); 
} 
$stmt = null; 
$dbh = null;

结论:
php 5.1.* PHP 5.2.*
执行正常 出现错误:“PHP Warning:  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined”
如果把":name"改成"?",那么两个版本都可以顺利进行。
不能同时使用两种符号。如 select * from t2 where name=? limit :page
测试3(limit绑定:page)
$stmt = $dbh->prepare('select * from t2 where name=:name limit :page'); 
$params = array(); 
$params['name'] = 'rentao';// 这里加不加":"都能成功执行 
$params['page'] = 2; 
foreach($params as $k=>$v){ 
$stmt->bindParam($k, $v); 
} 
$stmt->execute(); 
echo "HERE1\n"; 
$item = array(); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
var_dump($row); 
} 
echo "HERE2\n"; 
$stmt = null; 
$dbh = null;

结论:
PHP 5.1.* PHP 5.2.*
执行到$stmt->execute()时,进程一直处于等待状态中 执行正常:打印不出结果
测试4(在limit下进行预编译操作:page)——使用“?”机制运行
$stmt = $dbh->prepare('select * from t2 where name=? limit ?'); 
$params = array(); 
$params[] = 'rentao'; 
$params[] = 2; 
for($i=0,$iLen = count($params); $i < $iLen; $i++){ 
$k = $i+1; 
$stmt->bindParam($k, $params[$i]); 
} 
$stmt->execute(); 
$item = array(); 
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
var_dump($row); 
} 
$stmt = null; 
$dbh = null;

PHP 5.1.* PHP 5.2.*
执行正常 执行正常:打印不出结果
测试5---order by)
PHP 5.1.* PHP 5.2.*
打印出结果,但未按order by进行排序 执行正常:打印不出结果
总结
PHP在使用PDO做数据库预编译操作的时候,尽量避免使用limit, order by, group by 做预编译处理。绑定变量我们尽量使用统一标准,要不然都使用“?”,要不然使用“:key”。

有用的命令,我在php5.1.*进行测试,测试完了,我通过scp把文件传输到php5.2.*服务器上

scp -P9888 index.php rentao@192.168.10.4:/home/rentao
PHP 相关文章推荐
php 字符过滤类,用于过滤各类用户输入的数据
May 27 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
PHP及Zend Engine的线程安全模型分析
Nov 10 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
Linux系统递归生成目录中文件的md5的方法
Jun 29 PHP
在Debian系统下配置LNMP的教程
Jul 09 PHP
PHP制作用户注册系统
Oct 23 PHP
Zend Framework创建自己的动作助手详解
Mar 05 PHP
实例讲解php实现多线程
Jan 27 PHP
laravel框架邮箱认证实现方法详解
Nov 22 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
PHP实现简易用户登录系统
Jul 10 PHP
php打造属于自己的MVC框架
Mar 07 #PHP
smarty巧妙处理iframe中内容页的代码
Mar 07 #PHP
php 操作符与控制结构
Mar 07 #PHP
PHP中将字符串转化为整数(int) intval() printf() 性能测试
Mar 20 #PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 #PHP
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
Mar 05 #PHP
php在服务器执行exec命令失败的解决方法
Mar 03 #PHP
You might like
COM in PHP (winows only)
2006/10/09 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP列出MySQL中所有数据库的方法
2015/03/12 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
js常见表单应用技巧
2008/01/09 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
vue中appear的用法
2017/08/17 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
如何在JS文件中获取Vue组件
2020/09/16 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
Pyramid将models.py文件的内容分布到多个文件的方法
2013/11/27 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
python使用装饰器作日志处理的方法
2019/07/11 Python
python matplotlib如何给图中的点加标签
2019/11/14 Python
关于Keras Dense层整理
2020/05/21 Python
python实现单机五子棋
2020/08/28 Python
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
采购部部门职责
2013/12/15 职场文书
租房合同协议书
2014/04/09 职场文书
幼师求职信
2014/06/23 职场文书
光学与应用专业毕业生求职信
2014/09/01 职场文书
四风剖析查摆对照检查材料思想汇报
2014/09/24 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书