文档章节

PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue

hosser
 hosser
发布于 2017/05/16 22:49
字数 836
阅读 13
收藏 0

PHP扩展PDO MySQL之PDOStatement::bindParam vs bindValue技术

maybe yes 发表于2015-11-16 13:27

原文链接 : http://blog.lmlphp.com/archives/155/The_difference_of_PDOStatement_bindParam_and_bindValue_of_PHP_extension_PDO_MySQL  来自 : LMLPHP后院

前些日子将 LBlog 在线体验站点 http://lblog.lmlphp.com/ 搬迁到了 VPS 上,其实已经过去了好几个月了。新的 VPS 上 PHP 的版本比较高,所以运行的时候会出现提示 mysql 系列的函数过时的 Deprecated 错误。这个错误最简单的办法就是在报错级别那里屏蔽掉,但是这个不是我的风格,我更希望以更好的方式来解决。但是一上班根本没有时间,写个 MysqlPdo Enhance 的类,按照之前 LMLPHP 中 Mysql 驱动类的风格。为此,写 PDO 操作类的时候还专门定义了接口来约束自己的行为,生怕出问题,测试之后证明,完全兼容之前的 Mysql 类,写完花了这么几个月的时间,真的伤不起。

这次写 PDO 驱动类的时候,没有参照其他人的写法,完全看官方文档,结合自己的需要,尽量的简单的实现。其实 PDO 已经是面向对象的风格了,其实并不需要什么驱动类来太多的封装,写这个只是为了更好的兼容项目中的代码。刚开始我看 bindValue 和 bindParam 的时候,文档给我的感觉只是一个是变量,一个是确切的值。到后来才发现一个是引用,一个是普通传参。在测试修改操作的时候,发现数据库中最后一个字段和前一个字符串一样,int 类型没有收到影响,可能当时脑子太累的缘故,这个问题竟然搞了好久,第二天才弄清楚是因为在循环的时候使用了 bindParam 导致的。

MysqlPdoEnhance 驱动类已经上传到 LMLPHP 和 LBlog 中,LBlog 已经在初始化实例的时候自动选择对应的驱动类。这次改善使得 LBlog 系统更加优秀,对服务器环境的适应能力更强了。

MysqlPdoEnhance 类延续了 Mysql 类的简单风格,只有一个重量级的 query 方法,自动判断是返回资源还是影响的行数。同时也发现在使用 PDO 操作时,不能很好的做到这一点。因为执行 SELECT 的时候也有影响的行数,这点与一般的常识不一样,一般懂数据库的人都应该知道,SELECT 是不会影响到行的,但是 PDO 中的 rowCount 方法返回的值是选出的行数。所以,因为这个缘故,只能从 SQL 上面做一个简单的判断了,算是不太完美。

附 query 方法节选。

public function query($sql, $params = array()){ $stmt = $this->db->prepare($sql, array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); if($params){ foreach ($params as $k => $v){ if(is_array($v)){ $value = $v['value']; $type = isset($v['type']) ? $v['type'] : false; $length = isset($v['length']) ? $v['length'] : false; if($type && $length){ $stmt->bindValue($k, $value, $type, $length); }elseif($type){ $stmt->bindValue($k, $value, $type); }else{ $stmt->bindValue($k, $value); } }else{ $stmt->bindValue($k, $v); } } } $stmt->execute(); if(preg_match('/^update|^insert/i', trim($sql))){ return $stmt->rowCount(); }else{ return $stmt->fetchAll(PDO::FETCH_ASSOC); }}

阅(606)评(0)查看评论

 

本文转载自:https://blog.lmlphp.com/archives/155/The_difference_of_PDOStatement_bindParam_and_bindValue_of_PHP_e

hosser
粉丝 194
博文 78
码字总数 4614
作品 3
徐汇
私信 提问
PHP PDOStatement对象bindpram()、bindvalue()和bindcolum

PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别 PDOStatement::bindParam ― 绑定一个参数到指定的变量名。 绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或...

开元中国2015
2015/07/31
233
0
阅读杂记(RSA,PDO)

RSA算法 RSA Key Size Selection http://www.vocal.com/cryptography/rsa-key-size-selection/ 这篇文章说的是如何选择RSA密钥的长度。RSA密钥的长度是可以选择的,RSA密钥的长度影响加密后的...

王二狗子11
2018/01/08
0
0
PDOStatement::bindParam的一个陷阱

<?php $dbh = new PDO('mysql:host=localhost;dbname=test', "test"); $query = <<<QUERY INSERT INTO (, ) VALUES (:username, :password); QUERY; $statement = $dbh->prepare($query); $b......

snowing1990
2016/03/22
9
0
PDO 完全使用教程

一.PDO异常处理 PDO::ATTR_ERRMODE 1) PDO::ATTR_ERRMODE//不报错误(忽略)(0) 2) PDO::ERRMODE_WARNING //以警告的方式报错(1) 3) PDO::ERRMODE_EXCEPTION //以异常的方式报错(2) 二.PDO预处...

myzyq
2016/03/14
35
0
阅读鸟哥的风雪之隅PHP博客的笔记(1)

在PHP中使用协程实现多任务调度 http://www.laruence.com/2015/05/28/3038.html 2. Curl的毫秒超时的一个”Bug” CentOS服务器上, 当你设置了小于1000ms的超时以后, curl不会发起任何请求, 而...

laiconglin
2016/06/12
45
0

没有更多内容

加载失败,请刷新页面

加载更多

ngrok 外网映射工具

ngrok介绍 许多刚学java web的同学(包括我自己)肯定都非常好奇,如何在外网上访问自己做的项目,跟我们本地访问tomcat有什么区别? 今天就向大家介绍一个非常强大的外网映射工具:ngrok.ngrok可以...

edison_kwok
28分钟前
1
0
Spark Streaming的优化之路——从Receiver到Direct模式

          作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来...

个推
今天
3
0
壮丽70年·奋斗新时代|蒸妙集团熏蒸中会阴熏蒸的神奇好处

聚结相合之处为会。会阴居两阴间,为督、任、冲三脉的起点,三脉背出两阴之间,会聚阴部,因名会阴。会阴,经穴名。出《针灸甲乙经》。会阴别名屏翳、下极、金门。属任脉。在会阴部,男性当阴...

公益传承
今天
2
0
pentaho-kettle-8.2.0.0-R源码开发环境搭建

1.从Kettle官网下载源码,本文使用的是pentaho-kettle-8.2.0.0-R 下载地址:https://codeload.github.com/pentaho/pentaho-kettle/zip/8.2.0.0-R 2.打开eclipse,选择一个新的工作空间,然后设...

gq_2010
今天
1
0
lua web快速开发指南(7) - 高效的接口调用 - httpc库

httpc库基于cf框架都内部实现的socket编写的http client库. httpc库内置SSL支持, 在不使用代理的情况下就可以请求第三方接口. httpc支持header、args、body、timeout请求设置, 完美支持各种h...

水果糖的小铺子
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部