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
Ajax+PHP 边学边练之四 表单
Nov 27 PHP
服务器web工具 php环境下
Dec 29 PHP
浅析php中jsonp的跨域实例
Jun 21 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
php向js函数传参的几种方法
Aug 10 PHP
php的mssql数据库连接类实例
Nov 28 PHP
php 批量查询搜狗sogou代码分享
May 17 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
Dec 25 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 PHP
php post换行的方法
Feb 03 PHP
php的无刷新操作实现方法分析
Feb 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 curl模拟浏览器抓取网站信息
2013/10/28 PHP
PHP数据库链接类(PDO+Access)实例分享
2013/12/05 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
老生常谈的跨域处理
2017/01/11 Javascript
原生JS获取元素的位置与尺寸实现方法
2017/10/18 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
ES6 系列之 Generator 的自动执行的方法示例
2018/10/19 Javascript
TypeScript开发Node.js程序的方法
2019/04/30 Javascript
Python可跨平台实现获取按键的方法
2015/03/05 Python
深入理解python多进程编程
2016/06/12 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
解决Python对齐文本字符串问题
2019/08/28 Python
Pycharm操作Git及GitHub的步骤详解
2020/10/27 Python
全球最大的在线旅游公司:Expedia
2017/11/16 全球购物
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
Bath & Body Works阿联酋:在线购买沐浴和身体用品
2021/02/27 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
高中军训广播稿
2014/01/14 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
教师业务学习材料
2014/12/16 职场文书
vue router 动态路由清除方式
2022/05/25 Vue.js