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 相关文章推荐
人大复印资料处理程序_补充篇
Oct 09 PHP
建立文件交换功能的脚本(三)
Oct 09 PHP
php smarty模版引擎中的缓存应用
Dec 11 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
PHP中数组定义的几种方法
Sep 01 PHP
php编写的抽奖程序中奖概率算法
May 14 PHP
php使用GD实现颜色渐变实例
Jun 02 PHP
php使用curl打开https网站的方法
Jun 17 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
PHP巧妙利用位运算实现网站权限管理的方法
Mar 12 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 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分页类的代码
2011/05/18 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
js常见表单应用技巧
2008/01/09 Javascript
DOM节点删除函数removeChild()用法实例
2015/01/12 Javascript
jquery增加和删除元素的方法
2015/01/14 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
JS HTML5实现拖拽移动列表效果
2020/08/27 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
Python实现的建造者模式示例
2018/08/06 Python
浅谈Python脚本开头及导包注释自动添加方法
2018/10/27 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
python实现整数的二进制循环移位
2019/03/08 Python
python各类经纬度转换的实例代码
2019/08/08 Python
django连接oracle时setting 配置方法
2019/08/29 Python
大学生简历中个人的自我评价
2013/10/06 职场文书
党支部三严三实对照检查材料思想汇报
2014/09/29 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
销售辞职信范文
2015/03/02 职场文书
职工宿舍管理制度
2015/08/05 职场文书
成人成长感言如何写?
2019/08/16 职场文书
js实现自动锁屏功能
2021/06/02 Javascript
Python实现机器学习算法的分类
2021/06/03 Python