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

18.5.3  PDO的错误处理模式

PDO共提供了3种不同的错误处理模式,不仅可以满足不同风格的编程,也可以调整扩展处理错误的方式。

1.PDO::ERRMODE_SILENT

这是默认模式,在错误发生时不进行任何操作,PDO将只设置错误代码。开发人员可以通过PDO对象中的errorCode()和errorInfo()方法对语句和数据库对象进行检查。如果错误是由于对语句对象的调用而产生的,那么可以在相应的语句对象上调用errorCode()或errorInfo()方法。如果错误是由于调用数据库对象而产生的,那么可以在相应的数据库对象上调用上述两种方法。

2.PDO::ERRMODE_WARNING

除了设置错误代码,PDO还将发出一条PHP传统的E_WARNING消息,可以使用常规的PHP错误处理程序捕获该警告。如果只想看看发生了什么问题,而无意中断应用程序的流程,那么在调试或测试中这种设置很有用。该模式的设置方式如下:

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //设置警告模式处理错误报告

   

3.PDO::ERRMODE_EXCEPTION

除了设置错误代码,PDO还会抛出一个PDOException并设置其属性,以反映错误代码和错误信息。这种设置在调试中也很有用,因为它会放大脚本中产生错误的地方,从而非常快速地指出代码存在潜在问题的区域(记住,如果异常导致脚本终止,则事务将自动回滚)。异常模式的另一个有用的地方是,与传统的PHP风格的警告相比,可以更清晰地构造自己的错误处理;而且,比起以静寂方式及显式地检查每个数据库调用的返回值的模式,异常模式需要的代码及嵌套代码也更少。该模式的设置方法如下:

$dbh->setAttribute(PDO::ATTR_ERRMODE,   PDO::ERRMODE_EXCEPTION); //设置抛出异常模式处理错误

   

SQL标准提供了一组用于指示SQL查询结果的诊断代码,称为SQLSTATE代码。PDO制定了使用SQL-92 SQLSTATE错误代码字符串的标准,不同PDO驱动程序负责将它们的本地代码映射为适当的SQLSTATE代码。例如,可以在MySQL安装目录下的include/sql_state.h文件中找到MySQL的SQLSTATE代码列表。可以使用PDO对象或PDOStatement对象中的errorCode()方法返回一个SQLSTATE代码。如果需要关于一个错误的更多特定的信息,在这两个对象中还提供了一个errorInfo()方法,该方法将返回一个数组,其中包含SQLSTATE代码、特定于驱动程序的错误代码,以及特定于驱动程序的错误字符串。

18.5.4  使用PDO执行SQL语句

在使用PDO执行查询数据之前,先提供一组相关的数据。创建PDO对象并通过MySQL驱动连接localhost的MySQL数据库服务器,MySQL服务器的登录名为“MySQL_user”,密码为“MySQL_pwd”。创建一个以“testdb”命名的数据库,并在该数据库中创建一个联系人信息表contactInfo。建立数据表的SQL语句如下所示:

CREATE TABLE contactInfo (                                           #创建表contactInfo

         uid   mediumint(8) unsigned NOT NULL AUTO_INCREMENT,             #联系人ID

         name   varchar(50) NOT NULL,                                       #姓名

         departmentId   char(3) NOT NULL,                                      #部门编号

         address   varchar(80) NOT NULL,                                     #联系地址

         phone   varchar(20),                                                #联系电话

         email   varchar(100),                                                 #联系人的电子邮件

         PRIMARY   KEY(uid)                                              #设置用户ID为主键

);

   

数据表contactInfo建立后,向表中插入多行记录。本例中插入的数据如表18-4所示。

表18-4  实例演示中插入的数据记录

2b0865742df44335b6a0cf96a02fbe8a.png

在PHP脚本中,通过PDO执行SQL查询与数据库进行交互,可以分3种不同的策略,使用哪种方法取决于要执行什么操作。

1.使用PDO::exec()方法

当执行INSERT、UPDATE和DELETE等没有结果集的查询时,使用PDO对象中的exec()方法。该方法成功执行后,将返回受影响的行数。注意,该方法不能用于SELECT查询,代码如下所示:

5101630805b64a53941e742071931faa.png

2.使用PDO::query()方法

当执行返回结果集的SELECT查询,或者所影响的行数无关紧要时,应当使用PDO对象中的query()方法。如果该方法成功执行指定的查询,则返回一个PDOStatement对象。如果使用了query()方法,并想了解获取的数据行总数,可以使用PDOStatement对象中的rowCount()方法,代码如下所示:

fbba388a9b55476c9ebf04a110ae94ee.png

根据前面给出的数据样本,输出以下3条符合条件的数据记录:

一共从表中获取到3条记录:

高某某       15801680168      [email protected]

王某某       15801681357      [email protected]

陈某某       15801682468      [email protected]

   

另外,可以使用PDO过滤一些特殊字符,以防止一些能引起SQL注入的代码混入。我们在PDO中使用quote()方法实现,示例如下:

$query = "SELECT * FROM users WHERE   login=".$dbh->quote($_POST['login'])."   AND passwd=".$db->   quote($_POST['pass']);

   

3.使用PDO::prepare()和PDOStatement::execute()两个方法

当同一个查询需要多次执行时(有时需要迭代传入不同的列值),使用预处理语句的方式来实现,效率会更高。从MySQL 4.1开始,就可以结合MySQL使用PDO对预处理语句的支持。使用预处理语句需要用PDO对象中的prepare()方法去准备一个将要执行的查询,再用PDOStatement对象中的execute()方法来执行。

猜你喜欢

转载自www.cnblogs.com/itxdl/p/11397848.html