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如何透过ODBC来存取数据库
Oct 09 PHP
php pcntl_fork和pcntl_fork 的用法
Apr 13 PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
Nov 14 PHP
PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
Jun 12 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
PHP中Array相关函数简介
Jul 03 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
php 输出json及显示json中的中文汉字详解及实例
Nov 09 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
Feb 20 PHP
php连接mysql数据库最简单的实现方法
Sep 24 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
新手菜鸟必读:session与cookie的区别
2013/08/22 PHP
thinkPHP简单实现多个子查询语句的方法
2016/12/05 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
HTML中Select不用Disabled实现ReadOnly的效果
2008/04/07 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
JQuery获取鼠标进入和离开容器的方向
2016/12/29 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
利用python如何处理百万条数据(适用java新手)
2018/06/06 Python
解决Pycharm的项目目录突然消失的问题
2020/01/20 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
详解用Python进行时间序列预测的7种方法
2020/03/13 Python
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
鲜花方阵解说词
2014/02/13 职场文书
实习单位证明范例
2014/11/17 职场文书
基层工作经历证明
2015/06/19 职场文书
中学教代会开幕词
2016/03/04 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android
浅谈MySQL函数
2021/10/05 MySQL
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python