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之第十天
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
PHP生成网页快照 不用COM不用扩展.
Feb 11 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
Jul 17 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
Codeigniter实现发送带附件的邮件
Mar 19 PHP
php根据生日计算年龄的方法
Jul 13 PHP
Laravel4中的Validator验证扩展用法详解
Jul 26 PHP
Yii2单元测试用法示例
Nov 12 PHP
PHP实现接收二进制流转换成图片的方法
Jan 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
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
Yii使用migrate命令执行sql语句的方法
2016/03/15 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
js获取IP和PcName(IE)在vs中可用
2013/08/02 Javascript
javascript实现的弹出层背景置灰-模拟(easyui dialog)
2013/12/27 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
微信小程序 progress组件详解及实例代码
2016/10/25 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
基于javascript原生判断DOM是否加载完毕
2020/10/14 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python 使用get_argument获取url query参数
2017/04/28 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python加载自定义词典实例
2019/12/06 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
Python 读取WAV音频文件 画频谱的实例
2020/03/14 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
HelloFresh奥地利:立即订购烹饪盒
2019/02/22 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
护理学院专科毕业生求职信
2014/06/28 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
科级干部群众路线教育实践活动个人对照检查材料
2014/09/19 职场文书
2014年安全员工作总结
2014/11/13 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
入党申请书怎么写?
2019/06/11 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书