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 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
php学习 字符串课件
Jun 15 PHP
两个强悍的php 图像处理类1
Jun 15 PHP
Godaddy空间Zend Optimizer升级方法
May 10 PHP
php防盗链的常用方法小结
Jul 02 PHP
PHP数组无限分级数据的层级化处理代码
Dec 29 PHP
PHP以指定字段为索引返回数据库所取的数据数组
Jun 30 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
你应该知道PHP浮点数知识
May 13 PHP
php 问卷调查结果统计
Oct 08 PHP
详解使用php调用微信接口上传永久素材
Apr 11 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
smarty的保留变量问题
2008/10/23 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
浅析PHP7 的垃圾回收机制
2019/09/06 PHP
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
二叉树的非递归后序遍历算法实例详解
2014/02/07 Javascript
jQuery调取jSon数据并展示的方法
2015/01/29 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
js实现复制粘贴的两种方法
2020/12/04 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python Paramiko模块的使用实际案例
2018/02/01 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
Django之Mode的外键自关联和引用未定义的Model方法
2018/12/15 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
Keras中的多分类损失函数用法categorical_crossentropy
2020/06/11 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
泰国第一的化妆品网站:Konvy
2018/02/25 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
店长岗位的工作内容
2013/11/12 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
文明餐桌活动方案
2014/02/11 职场文书
协议书范本
2014/04/23 职场文书
村党支部书记承诺书
2014/05/29 职场文书
2015年医德考评自我评价
2015/03/03 职场文书
社区活动总结范文
2015/05/07 职场文书
初中信息技术教学反思
2016/02/16 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android