《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7

18.6  PDO对预处理语句的支持

在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句。针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语句(Prepared Statement)的机制,如图18-6所示。它可以将整个SQL命令向数据库服务器发送一次,以后如果参数发生变化,数据库服务器只需对命令的结构做一次分析就够了,即编译一次,可以多次执行。它会在服务器上缓存查询的语句和执行过程,只在服务器和客户端之间传输有变化的列值,以此消除额外的开销。这不仅大大减少了需要传输的数据量,还提高了命令的处理效率,可以有效防止SQL注入,在执行单个查询时快于直接使用query()或exec()方法,而且安全。

4cbac51f67e946a1855658725c95f688.png

图18-6  预处理语句的机制

 

18.6.1  了解PDOStatement对象

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

表18-5  PDOStatement类中的全部成员方法(共18个)

 

c866b1839f3f4659a549555ab294c069.png

   

 

18.6.2  准备语句

重复执行一个SQL查询,每次迭代使用不同的参数,这种情况使用预处理语句运行效率最高。使用预处理语句,首先需要在数据库服务器中准备好“一条SQL语句”,但并不需要马上执行。PDO支持使用“占位符”语法,将变量绑定到这条预处理的SQL语句中。另外,PDO几乎为支持的所有数据库提供了命名占位符模拟,甚至为生来就不支持该概念的数据库模拟预处理语句和绑定参数。这是PHP向前迈进的积极一步,因为这样可以使开发人员能够用PHP编写“企业级”的数据库应用程序,而不必特别关注数据库平台的能力。

对于一条准备好的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类对象。   

 

18.6.3  绑定参数

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

 

bindParam ( mixed parameter, mixed &variable [, int data_type   [, 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是可选项,通过该参数提供数据库驱动程序特定的选项。

将上一节中用两种占位符语法准备的SQL查询,使用bindParam()方法分别绑定对应的参数。查询中使用命名参数的绑定示例如下所示:

2e0afbe5bed04606bddc3df382cd63b6.png

 

查询中使用问号(?)参数的绑定示例如下所示,并在绑定时通过第三个参数显式地指定数据类型。当然,使用名字参数一样可以通过第三个参数指定类型并通过第四个参数指定长度。

97315e6f12d1445b9a937fd4af54d2b4.png

 

 

73a09b7e00cd411ab6c68bee3340793e.png

e67ab9c14ea84f85bc2a2c1bc7d55709.png

c48f99e86e624694bb7a901ed142cb8e.png

转载于:https://my.oschina.net/u/4125915/blog/3097508

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值