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 相关文章推荐
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
PHP文件操作实现代码分享
Sep 01 PHP
JoshChen_php新手进阶高手不可或缺的规范介绍
Aug 16 PHP
PHP json_encode中文乱码问题的解决办法
Sep 09 PHP
zf框架db类的分页示例分享
Mar 14 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
windows7下php开发环境搭建图文教程
Jan 06 PHP
WordPress网站性能优化指南
Nov 18 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
Apr 15 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
Oct 20 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使用ob_start生成html页面的方法
2014/11/07 PHP
php浏览历史记录的方法
2015/03/10 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
JavaScript 弹出窗体点击按钮返回选择数据的实现
2010/04/01 Javascript
Jquery post传递数组方法实现思路及代码
2013/04/28 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
jQuery实现提示密码强度的代码
2015/07/15 Javascript
JavaScript多线程详解
2015/08/12 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
React创建组件的三种方式及其区别
2017/01/12 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
AngualrJs清除定时器遇到的坑
2017/10/13 Javascript
详解vue组件中使用路由方法
2019/02/12 Javascript
vue项目中锚点定位替代方式
2019/11/13 Javascript
[02:49:21]2019完美盛典全程录像
2019/12/08 DOTA
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
基于python实现微信模板消息
2015/12/21 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
2016/10/11 Python
python学习之matplotlib绘制散点图实例
2017/12/09 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
Windows下python3.6.4安装教程
2018/07/31 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
PyCharm 光标变成黑块的解决方式
2021/02/06 Python
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
C++的几个面试题附答案
2016/08/03 面试题
建筑学推荐信
2013/11/03 职场文书
岗位职责范本
2013/11/23 职场文书
商业活动邀请函
2014/02/04 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
党政领导班子群众路线对照检查材料思想汇报
2014/09/27 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书