《细说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 实例演示中插入的数据记录

在PHP脚本中,通过PDO执行SQL查询与数据库进行交互,可以分3种不同的策略,使用哪种方法取决于要执行什么操作。
1.使用PDO::exec()方法
当执行INSERT、UPDATE和DELETE等没有结果集的查询时,使用PDO对象中的exec()方法。该方法成功执行后,将返回受影响的行数。注意,该方法不能用于SELECT查询,代码如下所示:

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

根据前面给出的数据样本,输出以下3条符合条件的数据记录:
一共从表中获取到3条记录:
高某某 15801680168 gmm@lampbrother.net
王某某 15801681357 wmm@lampbrother.net
陈某某 15801682468 cmm@lampbrother.net
另外,可以使用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()方法来执行。



《细说PHP》第四版 样章 第18章 数据库抽象层PDO 6的更多相关文章
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 1
现在,如果你已经能熟练地使用MySQL客户端软件来操作数据库中的数据,就可以开始学习如何使用PHP来显示和修改数据库中的数据了.PHP提供了标准的函数来操作数据库.在PHP 5以上的版本中可以使用My ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 12
18.9 管理表books实例 在Web项目中,几乎所有模块都要和数据表打交道,而对表的管理无非就是增.删.改.查等操作,所以熟练掌握对表进行管理的这些常见操作是十分有必的.本例为了能更好地展示PD ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 11
18.8.3 完美分页类的代码实现 分页类的编写除了需要使用在18.8.2节中提供的可以操作的3个成员方法,还需要更多的成员,但其他的成员方法和成员属性只需要内部使用,并不需要用户在对象外部操作,所 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 7
18.6 PDO对预处理语句的支持 在生成网页时,许多PHP脚本通常都会执行除参数外其他部分完全相同的查询语句.针对这种重复执行一个查询,但每次迭代使用不同参数的情况,PDO提供了一种名为预处理语句 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4
18.4 创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 10
18.8 设计完美分页类 数据记录列表几乎出现在Web项目的每个模块中,假设一张表中有十几万条记录,我们不可能一次全都显示出来,当然也不能仅显示几十条.为了解决这样的矛盾,通常在读取时设置以分页的形 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 9
18.7 PDO的事务处理 事务是确保数据库一致的机制,是一个或一系列的查询,作为一个单元的一组有序的数据库操作.如果组中的所有SQL语句都操作成功,则认为事务成功,那么事务被提交,其修改将作用于所 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8-1
18.6.5 获取数据 PDO的数据获取方法与其他数据库扩展非常类似,只要成功执行SELECT查询,都会有结果集对象生成.不管使用PDO对象中的query()方法,还是使用prepare()和exe ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 8
18.6.4 执行准备好的查询 当准备好查询并绑定了相应的参数后,就可以通过调用PDOStatement类对象中的execute()方法,反复执行在数据库缓存区准备好的语句了.在下面的示例中,向前面 ...
随机推荐
- chunked
简介 chunked是一种HTTP协议的分块传输编码的机制,即一个HTTP消息可以分成多个部分进行传输,它对于HTTP请求和HTTP响应都适用.对于非持续连接,浏览器通过连接是否关闭来界定请求和响应实 ...
- STM32 HAL_Deleay() 函数 导致程序卡死
出现问题场景: 我的程序有RTOS操作系统.使用的驱动库是STM32官方最新的HAL库. 移植好LwIP以太网协议后,在初始化网卡阶段程序卡死. 出现问题原因: 后经过蠢笨的printf打 ...
- C语言中,关于相除的问题
若定义的类型是 整数型:int a,b ;则a/b的值为整数的,不会带着小数点的..... 若定义的数据类型是 浮点型的 :double a,b; 则这种情况下,得到的结果与数学结果无异
- 【Linux命令】磁盘分区,格式化,挂载命令,创建交换分区(fdisk,mkfs,mount,umount)
友情链接 磁盘分区,格式化,挂载,创建交换分区:https://www.cnblogs.com/HeiDi-BoKe/p/11936998.html RAID工作级别:https://www.cnbl ...
- mysql 读写分离(手动和自动方法)
使用sqlalchemy 使mysq自动读写分离: 代码如下: from flask import Flask from flask_sqlalchemy import SQLAlchemy, Sig ...
- IntelliJ中Git突然不能用,报错 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)
记录一个昨天碰到的问题以及解决方法,希望对碰到一样问题的你有用! 昨天升级了一下Mac OS,重启后再打开IntelliJ,突然Git就不能用了,报了下面这样的错: 开始以为是不是Git出了问题,打开 ...
- ASP.NET MVC教程三:ASP.NET MVC部署方式
ASP.NET MVC编写的程序需要部署到IIS上面才能进行访问,部署方式分为两种. 一.直接用源代码部署 第一种方式可以直接使用源代码进行部署.部署步骤: 1.新建网站 在IIS里面选择网站,然后右 ...
- Selenium(十三):验证码的处理、WebDriver原理
1. 验证码的处理 对于Web应用来说,大部分的系统在用户登录时都要求用户输入验证码.验证码的类型很多,有字母数字的.有汉字的,甚至还需要用户输入一道算术题的答案的.对于系统来说,使用验证码可以有效地 ...
- Java每日一面(Part1:计算机网络)[19/11/02]
作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.TCP的滑动窗口 1.1 RTT和RTO的区别 RTT:发送一个数据包到收到对应的ACK,所花费的时间 RTO:重传时间间隔,TCP在发 ...
- kvm2
kvm虚拟机的桥接网络 默认的虚拟机网络是NAT模式,网段192.168.122.0/24 1:创建桥接网卡 创建桥接网卡命令 virsh iface-bridge eth0 br0 取消桥接网卡命令 ...