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学习 字符串课件
Jun 15 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
基于php-fpm的配置详解
Jun 03 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
Jun 27 PHP
PHP CodeIgniter框架的工作原理研究
Mar 30 PHP
zen_cart实现支付前生成订单的方法
May 06 PHP
Yii框架实现记录日志到自定义文件的方法
May 23 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
PHP实现多图上传和单图上传功能
May 17 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
Feb 21 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 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 in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
php计算title标题相似比的方法
2015/07/29 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
js用图作提交按钮或超连接
2008/03/26 Javascript
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
JQuery将文本转化成JSON对象需要注意的问题
2011/05/09 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
微信小程序实现MUI数字输入框效果
2018/01/31 Javascript
Nuxt.js实战和配置详解
2019/08/05 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
2019/11/01 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python实现全角半角字符互转的方法
2016/11/28 Python
python图书管理系统
2020/04/05 Python
对Python3中的input函数详解
2018/04/22 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python列表解析配合if else的方法
2018/06/23 Python
使用Python实现租车计费系统的两种方法
2018/09/29 Python
python覆盖写入,追加写入的实例
2019/06/26 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
Python中调用其他程序的方式详解
2019/08/06 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
python将图片转base64,实现前端显示
2020/01/09 Python
写好自荐信的要点
2013/11/06 职场文书
有限责任公司股东合作协议书范本
2014/10/30 职场文书
干部个人考察材料
2014/12/24 职场文书
信息简报范文
2015/07/21 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript