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

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

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()方法获取影响记录的行数。

参考来源:

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

http://www.lai18.com/content/369336.html

延伸阅读

《PHP数据库PDO系列》系列技术文章整理收藏

1php数据库抽象层 PDO

2php数据库抽象层之PDO介绍及简单实例

3PHP PDO类解决数据库连接问题

4PHP 5数据对象(PDO)抽象层与Oracle

5PHP PDOStatement:bindParam插入数据错误问题分析

6PDO防注入原理分析以及使用PDO的注意事项总结

7PHP数据库抽象层之PDO(一)——简介和安装配置

8PHP数据库抽象层之PDO(五)——错误与错误处理

9PHP数据库抽象层之PDO(三)——事务与自动提交

10PHP数据库抽象层之PDO(二)——连接与连接管理

11PHP数据库抽象层之PDO(四)——预处理语句与存储过程

12PHP数据库抽象层之PDO(七)——相关类和方法

13PHP数据库抽象层之PDO(六)——大对象(LOBs)

14PHP PDO操作总结

15PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别

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

17PHP中MySQL、MySQLi和PDO的用法和区别【原创】

18PHP实现PDO的mysql数据库操作类

19php使用pdo连接报错Connection failed SQLSTATE的解决方法

20php使用pdo连接并查询sql数据库的方法

21php使用pdo连接mssql server数据库实例

22php使用PDO方法详解

23php下pdo的mysql事务处理用法实例

24php使用PDO操作MySQL数据库实例

25PHP PDO fetch 模式各种参数的输出结果一览

26对PHP PDO的一些认识小结

27php中数据库连接方式pdo和mysqli对比分析

28PDO防注入原理分析以及注意事项

29php中mysql连接方式PDO使用详解

30PHP使用PDO连接ACCESS数据库

31php中PDO方式实现数据库的增删改查

32浅谈PDO的rowCount函数

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 22:52:44

PDO预处理语句PDOStatement对象使用总结的相关文章

前端学PHP之PDO预处理语句

× 目录 [1]定义 [2]准备语句 [3]绑定参数[4]执行查询[5]获取数据[6]大数据对象 前面的话 本来要把预处理语句和前面的基础操作写成一篇的.但是,由于博客园的限制,可能是因为长度超出,保存时总是报错,于是再开一篇.另一方面,相较于前面的exec()和query()语句来说,预处理语句更加常用 定义 在生成网页时,许多PHP脚本通常都会执行除参数之外,其他部分完全相同的查询语句,针对这种重复执行一个查询,每次迭代使用不同的参数情况,PDO提供了一种名为预处理语句(prepared s

pdo预处理语句

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

PDO预处理语句规避SQL注入攻击

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击. 第一种方法 <?php $dsn = "mysql:dbname=study;host=localhost"; $pdo = new PDO($dsn,"root","root"); /

php pdo预处理语句与存储过程

很多更成熟的数据库都支持预处理语句的概念.什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 1.查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次.当查询准备好后,数据库将分析.编译和优化执行该查询的计划.对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度.通过使用预处理语句,可以避免重复分析/编译/优化周期.简言之,预处理语句占用更少的资源,

PHP PDO 预处理语句与存储过程

很多更成熟的数据库都支持预处理语句的概念. 什么是预处理语句?可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制.预处理语句可以带来两大好处: 查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次.当查询准备好后,数据库将分析.编译和优化执行该查询的计划.对于复杂的查询,此过程 要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度.通过使用预处理语句,可以避免重复分析/编译/优化周 期.简言之,预处理语句占用更少的资源

PHP PDOStatement对象bindpram()、bindvalue()和bindcolum

PHP PDOStatement对象bindpram().bindvalue()和bindcolumn之间的区别 PDOStatement::bindParam ― 绑定一个参数到指定的变量名. 绑定一个PHP变量到用作预处理的SQL语句中的对应命名占位符或问号占位符. 不同于 PDOStatement::bindValue() ,此变量作为引用被绑定,并只在 PDOStatement::execute() 被调用的时候才取其值. PDOStatement::bindValue ― 把一个值绑定

MySQL pdo预处理能防止sql注入的原因

MySQL pdo预处理能防止sql注入的原因: 1.先看预处理的语法 $pdo->prepare('select * from biao1 where id=:id'); $pdo->execute([':id'=>4]); 2.语句一,服务器发送一条sql给mysql服务器,mysql服务器会解析这条sql. 语句二,服务器发送一条sql给mysql服务器,mysql服务器不会解析这条sql,只会把execute的参数当做纯参数赋值给语句一.哪怕参数中有sql命令也不会被执行,从而实

php -- PDO预处理

可以使用多种方式实现预处理:指的是在绑定数据进行执行的时候,可以有多种方式. 预处理语句中为变量 使用数组指定预处理变量 1.准备预处理语句(发送给服务器,让服务器准备预处理语句) PDOStatement PDO::prepare:类似exec将一条SQL语句发送给Mysql服务器 //PDO::prepare 能够自动的准备一个预处理语句,用户需要准备的只是预处理所要执行的语句 //需求:往学生表里循环插入10条记录 //PDO的预处理能够自动的将对应的以:开始的变量给记录下来,实际发送给服

PHP MySQL 预处理语句

PHP MySQL 预处理语句 预处理语句对于防止 MySQL 注入是非常有用的. 预处理语句及绑定参数 预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高. 预处理语句的工作原理如下: 预处理:创建 SQL 语句模板并发送到数据库.预留的值使用参数 "?" 标记 .例如:INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出 执行:最