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

18.6  PDO对预处理语句的支持

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

图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个)

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()方法分别绑定对应的参数。查询中使用命名参数的绑定示例如下所示:

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

原文地址:https://www.cnblogs.com/itxdl/p/11410380.html

时间: 2024-08-02 01:10:50

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

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

现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用MySQL和MySQLi两套扩展函数,MySQLi是PHP 5中新增的,是对MySQL扩展的改进.但由于历史遗留问题,很多老项目是在PHP 4时使用MySQL扩展开发的,如果在原有的项目上进行二次开发,或者找一些学习的例子,都要求开发人员会使用MySQL扩展函数.如果是新设计的项目,则推荐使用MySQL

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

18.4  创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创建对象的同时,需要建立一个与数据库服务器的连接,并选择一个数据库.PDO的构造方法原型如下: __construct ( string dsn [, string username [, string password [,   array driver_options]]] )        //

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

18.9  管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PDO的应用,并没有将数据表的操作封装成一个数据库操作类,而是采用了过程化的编写方式,用最直接的方式实现. 18.9.1  需求分析 本例主要的目标是实现对图书信息表books的管理过程,包括添加图书.修改图书.删除图书.遍历图书列表.搜索图书等操作.创建数据表books的SQL语句如下所示. 创建后,

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

18.2  PDO所支持的数据库 使用PHP可以处理各种数据库系统,包括MySQL.PostgreSQL.Oracle.MsSQL等.但访问不同的数据库系统时,其所使用的PHP扩展函数也是不同的.例如,使用PHP的MySQL或MySQLi扩展函数,只能访问MySQL数据库:如果需要处理Oracle数据库,就必须安装和重新学习PHP中处理Oracle的扩展函数库,每种数据库都有对应的扩展函数,如图18-3所示.应用每种数据库时都需要学习特定的函数库,这样是比较麻烦的,更重要的是这使得数据库间的移植

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

18.6.4  执行准备好的查询 当准备好查询并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面提供的contactInfo表中使用预处理方式连续执行同一条INSERT语句,通过改变不同的参数添加两条记录,代码如下所示: 如果你只是要传递输入参数,并且有许多这样的参数要传递,那么,下面示例提供的快捷方式语法会非常有帮助.该示例通过在execute()方法中提供一个可选参数,该参数是由准备查询中

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

《细说PHP》 第四版 样章 第二章 PHP的应用与发展 5

2.5  如何学习PHP PHP以其简单易学的特点,以及敏捷开发的优势,从一个几乎不被人知的开源项目,慢慢成长为技术人员首选的动态Web设计工具,与其他语言相比,PHP表现得更好.更快.更简单易学.尽管如此,我们在面对一项自己不熟悉的新技术时,仍然会感到无所适从,不知道从何处入手,似乎总是感觉摸不出一条清晰的脉络来.另外,最大的障碍莫过于学习的过程枯燥乏味,从而失去学习兴趣.不过,如果你能掌握一种适合你的学习方法,就可以事半功倍.根据笔者多年的PHP教学经验,和众多人才培养的成功案例,列出的学习

《细说PHP》第四版 样章 第23章 自定义PHP接口规范 1

如今的项目开发中,接口是很普遍的应用技术.现在好多项目组都单独设有接口开发人员.像腾讯.微博.淘宝等开放平台,其所谓的开放,就是提供一些可调用的接口,用于获取相关的信息.例如,微信用户基本信息.淘宝店铺.商品消息等,再根据这些信息,在应用里完成交互.虽然本章不会涉及太多PHP语言本身的新技术点,但可以看作程序架构设计.业务逻辑和设计模式的应用.我们在定义接口时,通常有两种规范,一种是被其他内部项目调用的接口,另一种是对外的接口,主要提供给外部开发者调用.两种接口最大区别是,内部接口不需要太严格的

《细说PHP》第四版 样章 第23章 自定义PHP接口规范 3

23.2  接口实现的基础 大家都很了解函数在本地应用,通过名称调用函数执行,并通过传递不同参数,函数有不同执行,执行后给调用者返回结果.如果把一个函数做成一个接口远程访问,也需要这几个步骤.使用HTTP的GET或POST等,通过URL并附带参数请求接口,接口执行后将返回值传回远端的调用者.请求者可以是浏览器,可以是PHP或其他语言程序,也可以是页面中的Ajax等.当然,接口返回值的格式也是统一的,要让各种语言和设备的请求者可以操作,通常使用XML或JSON格式作为返回数据. 23.2.1  实