在 PDO 中有两个获取程序中错误信息的方法,分别是 errorCode() 方法和 errorInfo() 方法。在介绍这两种方法之前,我们先来了解一下 PDO 中的错误处理模式。

1、PDO 的错误处理模式

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

1) PDO::ERRMODE_SILENT

PDO::ERRMODE_SILENT 为默认模式。 在发生错误时 PDO 将只简单地设置错误码,不做其它任何操作。可使用 PDO::errorCode() 和 PDO::errorInfo() 两个方法来检查语句和数据库对象。

如果错误是由于调用语句对象而产生的,那么可以调用这个对象的 PDOStatement::errorCode() 或 PDOStatement::errorInfo() 方法。如果错误是由于调用数据库对象而产生的,那么可以在数据库对象上调用这两个方法。

2) PDO::ERRMODE_WARNING

PDO::ERRMODE_WARNING 模式除了会设置错误码之外,PDO 还将发出一条传统的 E_WARNING 信息。在调试/测试期间如果只是想看看发生了什么问题,而不中断程序运行的话,可以使用该模式。

3) PDO::ERRMODE_EXCEPTION

PDO::ERRMODE_EXCEPTION 模式除了会设置错误码之外,PDO 还将抛出一个 PDOException 异常类并设置它的属性来反射错误码和错误信息。此模式在调试期间也非常有用,因为它会有效地放大脚本中产生错误的点,从而可以非常快速地指出代码中有问题的潜在区域。

注意:如果异常导致脚本终止,则事务被自动回滚。

PDO 使用 SQL-92 SQLSTATE 来规范错误码字符串,不同 PDO 驱动程序负责将它们的本地代码映射为适当的 SQLSTATE 代码。PDO::errorCode() 方法返回一个单独的 SQLSTATE 码。如果需要更多这个错误的细节信息,PDO 还提供了一个 PDO::errorInfo() 方法来返回一个包含 SQLSTATE 码、特定驱动错误码以及此驱动的错误字符串的数组。

异常模式另一个非常有用的作用是,相比传统 PHP 风格的警告,可以更清晰地构建自己的错误处理,而且比起静默模式和显式地检查每种数据库调用的返回值,异常模式需要的代码/嵌套更少。

【示例】创建 PDO 实例,并设置错误模式。

$dsn = 'mysql:dbname=test;host=127.0.0.1';

$user = 'root';

$pwd = 'root';

try {

$pdo = new PDO($dsn, $user, $pwd);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

} catch (PDOException $e) {

echo 'Connection failed: ' . $e->getMessage();

}

?>

除了示例中介绍的使用 PDO::setAttribute() 方法设置错误模式外,还可以在创建 PDO 实例时设置错误模式,如下所示:

$pdo = new PDO($dsn, $user, $pwd, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));

2、PDO::errorCode() 方法

PDO::errorCode() 方法用于获取在操作数据库句柄时所发生的错误代码,这些错误代码被称为 SQLSTATE 代码。其语法格式如下:

PDO::errorCode()

PDO::errorCode() 方法可以返回一个 SQLSTATE,一个由 5 个字母或数字组成的在 ANSI SQL 标准中定义的标识符。 简要地说,一个 SQLSTATE 由前面两个字符的类值和后面三个字符的子类值组成。

【示例】通过 PDO 连接数据库,并通过 errorCode() 方法获取错误代码。

$dsn = 'mysql:dbname=test;host=127.0.0.1';

$user = 'root';

$pwd = 'root';

try {

$pdo = new PDO($dsn, $user, $pwd);

$sql = 'select * from user';

$res = $pdo -> query($sql);

echo 'errorCode 为:'.$pdo -> errorCode().'
';

foreach ($res as $key => $value) {

echo '序号:'.$value['id'].'; 姓名:'.$value['name'].'; 年龄:'.$value['age'].'; 性别:'.$value['sex'].'
';

}

} catch (PDOException $e) {

echo 'Connection failed: ' . $e->getMessage();

}

?>

运行结果如下:

errorCode 为:00000

序号:1; 姓名:张三; 年龄:12; 性别:男

序号:2; 姓名:李四; 年龄:11; 性别:男

序号:3; 姓名:王五; 年龄:12; 性别:男

序号:4; 姓名:小明; 年龄:12; 性别:女

序号:5; 姓名:小红; 年龄:11; 性别:女

序号:6; 姓名:小刚; 年龄:14; 性别:男

3、PDO::errorInfo() 方法

PDO::errorInfo() 方法用于获取操作数据库句柄时所发生的错误信息。其语法格式如下:

PDO::errorInfo()

errorInfo() 方法的返回值为一个数组,它包含了相关的错误信息。

【示例】使用 PDO 中的 query 方法完成数据查询操作,并通过 errorInfo() 方法获取错误信息。

$dsn = 'mysql:dbname=test;host=127.0.0.1';

$user = 'root';

$pwd = 'root';

try {

$pdo = new PDO($dsn, $user, $pwd);

// $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = 'select * from userr';

$res = $pdo -> query($sql);

echo 'errorInfo 为:
';

print_r($pdo -> errorInfo());

} catch (PDOException $e) {

echo 'Connection failed: ' . $e->getMessage();

}

?>

示例中我们查询了一个不存在的数据库,运行结果为:

errorInfo 为:

Array ( [0] => 42S02 [1] => 1146 [2] => Table 'test.userr' doesn't exist )

PDO 和 PDOStatement 对象中都有 errorCode() 和 errorInfo() 方法,如果没有任何错误,errorCode() 返回的是 00000;否则就会返回一些错误代码。而 errorInfo() 返回的是一个数组,包括 PHP 定义的错误代码和 MySQL 的错误代码及错误信息。

php mysql errorcode_PHP errorCode()和errorInfo():PDO中的错误处理相关推荐

  1. php pdo mysql存储过程_MySQL从PHP PDO中的存储过程检索变量

    事实证明,这是一个已经持续了很长时间的错误-自2005年以来! 有多种方法可以获得答案,我找到了其中一个并证明了这一点-- '技巧'是从'MysqL'程序获取输出.这是一个"两个阶段&quo ...

  2. mysql 存储过程 错误码_mysql存储过程中的错误处理_mysql

    mysql存储过程中的异常处理 http://www.cnblogs.com/cookiehu/p/4994278.html 定义异常捕获类型及处理方法: DECLAREhandler_action ...

  3. mysql econnreset_如何在Node.js中调试错误ECONNRESET?

    我正在使用Socket.io运行Express.js应用程序用于聊天Web应用程序,并且在24小时内大约5次随机收到以下错误.节点进程将被永久封装,并立即重新启动. 问题是重新启动Express将我的 ...

  4. PDO中错误处理:errorCode方法和errorInfo方法

    在PDO中,有两个获取程序中错误信息的方法:errorCode方法和errorInfo方法. 1.errorCode方法 errorCode方法用于获取在操作数据库句柄时所发生的错误代码,这个错误代码 ...

  5. php pdo 显示二进制,php – 在MySQL PDO中显示警告

    我想知道如何在MySQL PDO中获取警告计数. 在控制台中进行查询时,我发出警告,查找varchar而不添加aphostrophes("). mysql> describe keyw ...

  6. pdo mysql防注入_Php中用PDO查询Mysql来避免SQL注入风险的方法

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  7. php 中curd表达啥,CURD语句的基本语法和PDO中操作数据表的基本步骤实例演示增删改查命令 2019年07月24日 23时10分...

    一.常用的CUR 最常用的就是: `CURD` 增删改查   它代表创建(Create).更新(Update).读取(Read)和删除(Delete)操作. 新增操作语法 * SQL规范: `INSE ...

  8. MySQL数据库基本操作总结(不断更新中......)

    1.登录mysql数据库: mysql -u root -p 输入密码 2.登出mysql数据库: \q 3.关系型数据库管理系统(RDBMS)来存储和管理的大数据量.所谓的关系型数据库,是建立在关系 ...

  9. mysql配置日志老化配置_mysql中日志的配置与分析

    默认情况下,如果日志没有配置,则只记录错误日志,记录到syslog,配置文件 /etc/mysql/conf.d/mysqld_safe_syslog.cnf (ubuntu下) [mysqld_sa ...

最新文章

  1. python代码打印二叉树某一特定层的节点
  2. 李飞飞公布谷歌云TPU、AutoML、行业方案等多项进展,AI云计算成谷歌全新增长点...
  3. 图解Elasticsearch中的_source、_all、store和index属性
  4. c语言申请字符串动态,【分享】C语言动态长度字符串
  5. C++ 使用dynamic_cast执行基类向派生类的转换
  6. pygame两图层怎么搞_每天解决一个卖酒问题(176):小白怎么开拓市场?
  7. IntelliJ IDEA 快捷键(一)(window版)
  8. 计算机网络【三】物理层数据通信
  9. Vue指令_常用vue指令_自定义全局指令_自定义局部指令---vue工作笔记0016
  10. 线程池的拒绝策略(重要)
  11. create user 'root'@'localhost' identified by 。。。
  12. 红绿3d眼镜与红蓝3d眼镜区别_佩极定制眼镜青少年3D打印定制系列全新发布
  13. 暴风影音CTO:暴风门事件给研发团队带来的启示
  14. qt 程序运行终端报错 D:\Program Files\SogouInput\Components\程序异常结束。
  15. Oracle AutoVue 21.0.x最新支持程序文件格式及版本
  16. jzojWZK打雪仗【高精】【DP】【卡特兰数】
  17. 聊聊傅里叶变换的意义和定义
  18. 盘点各种语言的输出语句
  19. 5.Serializer,ModelSerializer区别
  20. 算法中的『前缀和』及『差分』思想详解

热门文章

  1. 惊艳二重奏!专家这样用开源软件建立监控体系
  2. 你不知道的事:AWR 基线和 AWR Compare Period Report 功能介绍
  3. OpenHarmony移植案例:如何适配服务启动引导部件bootstrap_lite
  4. 在springboot中,如何读取配置文件中的属性
  5. U2Net基于ModelArts Notbook的仿真实验
  6. 【华为云技术分享】《跟唐老师学习云网络》— iptables - filter过滤功能
  7. Python 修改pip源---windows / Linux
  8. 【Python3网络爬虫开发实战】 1.7-App爬取相关库的安装
  9. MATLAB矩阵的分解与变换
  10. 计算机图形学——阴影