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和ACCESS写聊天室(三)
Oct 09 PHP
php5新改动之短标记启用方法
Sep 11 PHP
在IIS7.0下面配置PHP 5.3.2运行环境的方法
Apr 13 PHP
php使用sql数据库 获取字段问题介绍
Aug 12 PHP
php中getservbyport与getservbyname函数用法实例
Nov 18 PHP
PHP遍历数组的三种方法及效率对比分析
Feb 12 PHP
php实现插入数组但不影响原有顺序的方法
Mar 27 PHP
PHP防盗链的基本思想 防盗链的设置方法
Sep 25 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
php连接sftp的作用以及实例代码
Sep 23 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
PHP5+UTF8多文件上传类
2008/10/17 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
jquery实现简单文字提示效果
2015/12/02 Javascript
jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
2016/06/07 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
在vue-cli中引入lodash.js并使用详解
2019/11/13 Javascript
关于vue利用postcss-pxtorem进行移动端适配的问题
2019/11/20 Javascript
Vue看了就会的8个小技巧
2021/01/21 Vue.js
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
wxPython实现文本框基础组件
2019/11/18 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
Python 如何实现数据库表结构同步
2020/09/29 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
道德模范先进事迹
2014/02/14 职场文书
出国签证在职证明
2014/09/20 职场文书
优秀党员申报材料
2014/12/18 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
高二英语教学反思
2016/03/03 职场文书
浙江省杭州市平均工资标准是多少?
2019/07/09 职场文书
MySQL中utf8mb4排序规则示例
2021/08/02 MySQL