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遍历目录并返回统计目录大小
Jun 09 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
PHP写日志的实现方法
Nov 05 PHP
PHP中通过fopen()函数访问远程文件示例
Nov 18 PHP
php最简单的删除目录与文件实现方法
Nov 28 PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 PHP
PHP基于反射机制实现插件的可插拔设计详解
Nov 10 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
PHP批量删除jQuery操作
Jul 23 PHP
详解PHP发送邮件知识点
May 06 PHP
Laravel框架实现的批量删除功能示例
Jan 16 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引用传值实例详解学习
2013/11/06 PHP
使用URL传输SESSION信息
2015/07/14 PHP
ThinkPHP模板标签eq if 中区分0,null,false的方法
2017/03/24 PHP
php use和include区别总结
2019/10/13 PHP
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
jQuery页面图片伴随滚动条逐渐显示的小例子
2013/03/21 Javascript
利用div+jquery自定义滚动条样式的2种方法
2013/07/18 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jQuery提交多个表单的小技巧
2014/07/27 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
简介JavaScript中valueOf()方法的使用
2015/06/05 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
CKeditor富文本编辑器使用技巧之添加自定义插件的方法
2019/06/14 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
关于better-scroll插件的无法滑动bug(2021通过插件解决)
2021/03/01 Javascript
[40:01]OG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
json跨域调用python的方法详解
2017/01/11 Python
Python使用arrow库优雅地处理时间数据详解
2017/10/10 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
详解Python循环作用域与闭包
2019/03/21 Python
深入了解Python 变量作用域
2020/07/24 Python
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
委托证明的格式
2014/01/10 职场文书
业务部主管岗位职责
2014/01/29 职场文书
法律专业学生的自我评价
2014/02/07 职场文书
社会实践活动总结范文
2014/07/03 职场文书
电话客服工作职责
2014/07/27 职场文书
2014年实验室工作总结
2014/12/03 职场文书
小兵张嘎电影观后感
2015/06/03 职场文书
如何制作自己的原生JavaScript路由
2021/05/05 Javascript
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers