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批量生成随机用户名
Jul 10 PHP
谈谈新手如何学习PHP 默默经典版本
Aug 04 PHP
PHP 读取和修改大文件的某行内容的代码
Oct 30 PHP
PHP session有效期session.gc_maxlifetime
Apr 20 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
Apr 15 PHP
php自动更新版权信息显示的方法
Jun 19 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
Sep 28 PHP
Laravel推荐使用的十个辅助函数
May 10 PHP
在Laravel5中正确设置文件权限的方法
May 22 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实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
jquery 防止表单重复提交代码
2010/01/21 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
基于jquery实现弹幕效果
2016/09/29 Javascript
浅谈JS中String()与 .toString()的区别
2016/10/20 Javascript
JavaScript prototype属性详解
2016/10/25 Javascript
JavaScript表单验证的两种实现方法
2017/02/11 Javascript
详解用vue-cli来搭建vue项目和webpack
2017/04/20 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
JS插入排序简单理解与实现方法分析
2019/11/25 Javascript
微信小程序服务器日期格式化问题
2020/01/07 Javascript
jQuery实现获取多选框的值示例
2020/02/07 jQuery
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
详解python的sorted函数对字典按key排序和按value排序
2018/08/10 Python
Python matplotlib实时画图案例
2020/04/23 Python
Python爬虫爬取有道实现翻译功能
2020/11/27 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
俄罗斯购买自行车网站:Vamvelosiped
2021/01/29 全球购物
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
实习教师自我鉴定
2013/09/27 职场文书
学期自我鉴定范文
2013/10/01 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
银行竞聘上岗演讲稿
2014/09/12 职场文书
灵山大佛导游词
2015/02/04 职场文书
酒店前台岗位职责
2015/04/16 职场文书
三八妇女节主持词
2015/07/04 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
MySQL优化之慢日志查询
2022/06/10 MySQL
Java使用HttpClient实现文件下载
2022/08/14 Java/Android