PDO预处理语句PDOStatement对象使用总结


Posted in PHP onNovember 20, 2014

PDO对预处理语句的支持需要使用PDOStatement类对象,但该类对象并不是通过NEW关键字实例化出来的,而是通过PDO对象中的prepare()方法,在数据库服务器中准备好一个预处理的SQL语句后直接返回的。如果通过之前执行PDO对象中的query()方法返回的PDOStatement类对象,只代表的是一个结果集对象。而如果通过执行PDO对象中的prepare()方法产生的PDOStatement类对象,则为一个查询对象,能定义和执行参数化的SQL命令。PDOStatement类中的全部成员方法如下所示:

PDOStatement::bindColumn — 绑定一列到一个 PHP 变量

PDOStatement::bindParam — 绑定一个参数到指定的变量名

PDOStatement::bindValue — 把一个值绑定到一个参数

PDOStatement::closeCursor — 关闭游标,使语句能再次被执行。

PDOStatement::columnCount — 返回结果集中的列数

PDOStatement::debugDumpParams — 打印一条 SQL 预处理命令

PDOStatement::errorCode — 获取跟上一次语句句柄操作相关的 SQLSTATE

PDOStatement::errorInfo — 获取跟上一次语句句柄操作相关的扩展错误信息

PDOStatement::execute — 执行一条预处理语句

PDOStatement::fetch — 从结果集中获取下一行

PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组

PDOStatement::fetchColumn — 从结果集中的下一行返回单独的一列。

PDOStatement::fetchObject — 获取下一行并作为一个对象返回。

PDOStatement::getAttribute — 检索一个语句属性

PDOStatement::getColumnMeta — 返回结果集中一列的元数据

PDOStatement::nextRowset — 在一个多行集语句句柄中推进到下一个行集

PDOStatement::rowCount — 返回受上一个 SQL 语句影响的行数

PDOStatement::setAttribute — 设置一个语句属性

PDOStatement::setFetchMode — 为语句设置默认的获取模式。

1、准备语句

重复执行一个SQL查询,通过每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高。使用预处理语句,首先需要在数据库服务器中先准备好“一个SQL语句”,但并不需要马上执行。PDO支持使用“占位符”语法,将变量绑定到这个预处理的SQL语句中。对于一个准备好的SQL语句,如果在每次执行时都要改变一些列值,这种情况必须使用“占位符号”而不是具体的列值。在PDO中有两种使用占位符的语法:“命名参数”和“问号参数”,使用哪一种语法要看个人的喜好。

使用命名参数作为占位符的INSERT插入语句:

$dbh->prepare(“insert into contactinfo(name,address,phone) values(:name,:address,:phone)”);

需要自定义一个字符串作为“命名参数”,每个命名参数需要冒号(:)开始,参数的命名一定要有意义,最好和对应的字段名称相同。
使用问号(?)参数作为占位符的INSERT插入语句:
$dbh->prepare(“insert into contactinfo(name,address,phone) values(?,?,?)”);

问号参数一定要和字段的位置顺序对应。不管是使用哪一种参数作为占位符构成的查询,或是语句中没有用到占位符,都需要使用PDO对象中的prepare()方法,去准备这个将要用于迭代执行的查询,并返回PDOStatement类对象。

2、绑定参数

当SQL语句通过PDO对象中的prepare()方法在数据库服务器端准备好了以后,如果使用了占位符,就需要在每次执行时替换输入的参数。可以通过PDOStatement对象中的bindParam()方法,把参数变量绑定到准备好的占位符上(位置或名字要对应)。方法bindParame()的原型如下所示:

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

第一个参数parameter是必选项,如果在准备好的查询中占位符语法使用名字参数,那么将名字参数字符串作为bindParam()方法的第一个参数提供。如果占位符语法使用问号参数,那么将准备好的查询中列值占位符的索引偏移量,作为该方法的第一个参数。

第二个参数variable也是可选项,提供供给第一个参数所指定占位符的值。因为该参数是按引用传递的,所以只能提供变量作为参数,不能直接提供数值。

第三个参数data_type是可选项,为当前被绑定的参数设置数据类型。可以为以下值。

PDO::PARAM_BOOL 代表boolean数据类型。
PDO::PARAM_NULL 代表SQL中的NULL类型。
PDO::PARAM_INT 代表SQL中的INTEGER数据类型。
PDO::PARAM_STR 代表SQL中的CHAR、VARCHAR和其他字符串数据类型。
PDO::PARAM_LOB 代表SQL中大对象数据类型。

第四个参数length是可选项,用于指定数据类型的长度。

第五个参数driver_options是可选项,通过该参数提供任何数据库驱动程序特定的选项。
使用命名参数作为占位符的参数绑定示例:

<?php

//...省略PDO连接数据库代码

$query = "insert into contactinfo (name,address,phone) values(:name,:address,:phone)";

$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法

 

$stmt->blinparam(':name',$name);        //将变量$name的引用绑定到准备好的查询名字参数":name"中

$stmt->blinparam(':address',$address);

$stmt->blinparam(':phone',phone);

//...

?>

使用问号(?)作为占位符的参数绑定示例:

<?php

//...省略PDO连接数据库代码

$query = "insert into contactinfo (name,address,phone) values(?,?,?)";

$stmt = $dbh->prepare($query);          //调用PDO对象中的prepare()方法

 

$stmt->blinparam(1,$name,PDO::PARAM_STR);        //将变量$name的引用绑定到准备好的查询名字参数":name"中

$stmt->blinparam(2,$address,PDO::PARAM_STR);

$stmt->blinparam(3,phone,PDO::PARAM_STR,20);

//...

?>

3、执行准备语句

当准备语句完成,并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了。在下面的示例中,向前面提供的contactinfo表中,使用预处理方式连续执行同一个INSERT语句,通过改变不同的参数添加两条记录。如下所示:

<?php 

try {

     $dbh = new PDO('mysql:dbname=testdb;host=localhost', $username, $passwd);

}catch (PDOException $e){

    echo '数据库连接失败:'.$e->getMessage();

    exit;

}

 

$query = "insert into contactinfo (name,address,phone) values(?,?,?)";

$stmt = $dbh->prepare($query);

 

$stmt->blinparam(1,$name);      

$stmt->blinparam(2,$address);

$stmt->blinparam(3,phone);

 

$name = "赵某某";

$address = "海淀区中关村";

$phone = "15801688348";

 

$stmt->execute();           //执行参数被绑定后的准备语句

?>

如果你只是要传递输入参数,并且有许多这样的参数要传递,那么你会觉得下面所示的快捷方式语法非常有帮助。是通过在execute()方法中提供一个可选参数,该参数是由准备查询中的命名参数占位符组成的数组,这是第二种为预处理查询在执行中替换输入参数的方式。此语法使你能够省去对$stmt->bindParam()的调用。将上面的示例做如下修改:
<?php 

//...省略PDO连接数据库代码

$query = "insert into contactinfo (name,address,phone) values(?,?,?)";

$stmt = $dbh->prepare($query); 

 

//传递一个数组为预处理查询中的命名参数绑定值,并执行一次。

$stmt->execute(array("赵某某","海淀区","15801688348"));

?>

另外,如果执行的是INSERT语句,并且数据表中有自动增长的ID字段,可以使用PDO对象中的lastinsertId()方法获取最后插入数据表中的记录ID。如果需要查看其他DML语句是否执行成功,可以通过PDOStatement类对象中的rowCount()方法获取影响记录的行数。

PHP 相关文章推荐
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
PHP使用GIFEncoder类处理gif图片实例
Jul 01 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
Laravel 5框架学习之表单验证
Apr 08 PHP
PHP实现限制IP访问的方法
Apr 20 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
PHP连接及操作PostgreSQL数据库的方法详解
Jan 30 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
May 05 PHP
php简单检测404页面的方法示例
Aug 23 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
Dec 20 PHP
php中ob_get_length缓冲与获取缓冲长度实例
Nov 20 #PHP
PHP中UNIX时间戳和日期间的转换与计算实例
Nov 19 #PHP
PHP中上传多个文件的表单设计例子
Nov 19 #PHP
PHP中使用GD库创建圆形饼图的例子
Nov 19 #PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
Nov 19 #PHP
PHP图像处理之使用imagecolorallocate()函数设置颜色例子
Nov 19 #PHP
PHP GD库生成图像的几个函数总结
Nov 19 #PHP
You might like
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
php 输出双引号&quot;与单引号'的方法
2010/05/09 PHP
PHP调用Webservice实例代码
2011/07/29 PHP
php中取得文件的后缀名?
2012/02/20 PHP
php数字游戏 计算24算法
2012/06/10 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
功能强大的PHP发邮件类
2016/08/29 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
Avalon中文长字符截取、关键字符隐藏、自定义过滤器
2016/05/18 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
使用jQuery ajaxupload插件实现无刷新上传文件
2017/04/23 jQuery
微信网页登录逻辑与实现方法
2019/04/29 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
python实现文件快照加密保护的方法
2015/06/30 Python
python开发简易版在线音乐播放器
2017/03/03 Python
python 读入多行数据的实例
2018/04/19 Python
python如何查看微信消息撤回
2018/11/27 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
python pillow模块使用方法详解
2019/08/30 Python
python基于celery实现异步任务周期任务定时任务
2019/12/30 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
2021年的Python 时间轴和即将推出的功能详解
2020/07/27 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
delegate与普通函数的区别
2014/01/22 面试题
了解AppleShare protocol(AppleShare协议)吗
2015/08/28 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
大四学生思想汇报
2014/01/13 职场文书
电大毕业自我鉴定
2014/02/03 职场文书
实习护士自荐信
2014/06/21 职场文书
先进个人评语大全
2015/01/04 职场文书
2015年教师节演讲稿范文
2015/03/19 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
golang协程池模拟实现群发邮件功能
2021/05/02 Golang
yolov5返回坐标的方法实例
2022/03/17 Python
SQL Server 中的事务介绍
2022/05/20 SQL Server