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 相关文章推荐
支持php4、php5的mysql数据库操作类
Jan 10 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
Nov 04 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
PHP中快速生成随机密码的几种方式
Apr 17 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
Yii2框架实现登陆添加验证码功能示例
Jul 12 PHP
mysqli扩展无法在PHP7下升级问题的解决
Sep 10 PHP
PHP7.0连接DB操作实例分析【基于mysqli】
Sep 26 PHP
浅谈如何提高PHP代码质量之端到端集成测试
May 28 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实现对二维数组某个键排序的方法
2016/09/14 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
php异常处理捕获错误整理
2019/09/23 PHP
用于判断用户注册时,密码强度的JS代码
2009/01/01 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
2015/07/27 Javascript
jQuery超赞的评分插件(8款)
2015/08/20 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
AngularJS 支付倒计时功能实现思路
2017/06/05 Javascript
详解webpack 多页面/入口支持&amp;公共组件单独打包
2017/06/29 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
python求质数列表的例子
2019/11/24 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
香奈儿美国官网:CHANEL美国
2020/05/20 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
中学生校园广播稿
2014/01/16 职场文书
说明书格式及范文
2014/05/07 职场文书
2015年党日活动总结范文
2015/03/25 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
2019年大学生学年自我鉴定!
2019/03/25 职场文书
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
vue实现拖拽交换位置
2022/04/07 Vue.js