PHP中PDO的错误处理


Posted in PHP onSeptember 04, 2011

面向对象的方式
先看看如果连接错误等的处理,PHP中PDO的错误处理,使用面向对象的方式来处理:

<?php 
try { 
 $db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
 $db = null; 
} catch (PDOException $e) { 
 print "Error: " . $e->getMessage() . "<br/>"; 
 die(); 
} 
?>

这里利用我们PHP 5面向对象的异常处理特征,如果里面有异常的话就初始化调用PDOException来初始化一个异常类。
PDOException异常类的属性结构:
<?php 
class PDOException extends Exception 
{ 
 public $errorInfo = null; // 错误信息,可以调用 PDO::errorInfo() 或 PDOStatement::errorInfo()来访问 
 protected $message; // 异常信息,可以试用 Exception::getMessage() 来访问 
 protected $code; // SQL状态错误代码,可以使用 Exception::getCode() 来访问 
} 
?>

这个异常处理类是集成PHP 5内置的异常处理类,我们简单的看一下PHP 5内置的异常处理类结构:
<?php 
class Exception 
{ 
 // 属性 
 protected $message = 'Unknown exception'; // 异常信息 
 protected $code = 0; // 用户自定义异常代码 
 protected $file; // 发生异常的文件名 
 protected $line; // 发生异常的代码行号 
 // 方法 
 final function getMessage(); // 返回异常信息 
 final function getCode(); // 返回异常代码 
 final function getFile(); // 返回发生异常的文件名 
 final function getLine(); // 返回发生异常的代码行号 
 final function getTrace(); // backtrace() 数组 
 final function getTraceAsString(); // 已格成化成字符串的 getTrace() 信息 
} 
?>

相应的,在代码中可以合适的调用 getFile() 和 getLine() 来进行错误定位,更方便的进行调试。
使用面向过程的方法
先看代码:
<? 
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
$rs = $db->query("SELECT aa,bb,cc FROM foo"); 
if ($db->errorCode() != '00000'){ 
 print_r($db->errorInfo()); 
 exit; 
} 
$arr = $rs->fetchAll(); 
print_r($arr); 
$db = null; 
?>

PDO和PDOStatement对象有errorCode() 和 errorInfo() 方法,如果没有任何错误, errorCode() 返回的是: 00000 ,否则就会返回一些错误代码。errorInfo() 返回的一个数组,包括PHP定义的错误代码和MySQL的错误代码和错误信息,数组结构如下:
Array
(
 [0] => 42S22
 [1] => 1054
 [2] => Unknown column 'aaa' in 'field list'
)
每次执行查询以后,errorCode() 的结果都是最新的,所以我们可以很容易自己控制错误信息显示。
在使用PDO进行那个PHP和数据库开发过程中,如果再碰到错误咋办?按照上面的方式处理吧。

11.3.4 PDO的错误处理

PDO提供了两个获得程序中的错误信息的方法,一个是errorCode()方法;另一个是errorInfo()方法。

1.errorCode()方法

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

01 string errorCode ( void ) errorCode()方法的返回值为一个SQLSTATE,SQLSTATE是由5个数字和字母组成的代码。下面是使用errorCode()方法的示例:

【程序11-17】光盘\code\11\pdo\errorCode.php

<?php 
$dsn = 'mysql:dbname=shop;host=localhost'; 
$user_name = 'root'; 
$user_psw = 'root'; 
$pdo = new PDO($dsn, $user_name, $user_psw); 
$pdo->exec("update mytable set age=28 where id=1 ");//表mytable不存在 
echo "errorCode为: ".$pdo->errorCode(); 
?>

上述代码输出的错误代码如图11-13所示。
PHP中PDO的错误处理
2.errorInfo()方法

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

01 array errorInfo ( void ) errorInfo()方法的返回值为一个数组,该数组里面包含了相关的错误信息,使用errorInfo()方法的示例代码如下:

【程序11-18】光盘\code\11\pdo\errorInfo.php

<?php 
$dsn = 'mysql:dbname=shop;host=localhost'; 
$user_name = 'root'; 
$user_psw = 'root'; 
$pdo = new PDO($dsn, $user_name, $user_psw); 
$pdo->exec("update mytable set age=28 where id=1 ");//表mytable不存在 
echo "errorInfo为: "; 
print_r($pdo->errorInfo()); 
?>

上面代码输出的错误信息如图11-14所示。
PHP中PDO的错误处理
PHP 相关文章推荐
解决MySQL中文输出变成问号的问题
Jun 05 PHP
PHP daddslashes 使用方法介绍
Oct 26 PHP
mysqli_set_charset和SET NAMES使用抉择及优劣分析
Jan 13 PHP
解决FastCGI 进程超过了配置的活动超时时限的问题
Jul 03 PHP
php的XML文件解释类应用实例
Sep 22 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
Windows下PHP开发环境搭建教程(Apache+PHP+MySQL)
Jun 13 PHP
yii2缓存Caching基本用法示例
Jul 18 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
PHP 7.4中使用预加载的方法详解
Jul 08 PHP
php中将网址转换为超链接的函数
Sep 02 #PHP
php ajax 静态分页过程形式
Sep 02 #PHP
php中防止伪造跨站请求的小招式
Sep 02 #PHP
10个实用的PHP代码片段
Sep 02 #PHP
PHP文件操作实现代码分享
Sep 01 #PHP
深入探讨PHP中的内存管理问题
Aug 31 #PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 #PHP
You might like
php中函数的形参与实参的问题说明
2010/09/01 PHP
基于empty函数的输出详解
2013/06/17 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
js AspxButton的客户端操作
2009/06/26 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
在浏览器中实现图片粘贴的jQuery插件-- pasteimg使用指南
2014/12/29 Javascript
浅谈angular懒加载的一些坑
2016/08/20 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
Vue中的$set的使用实例代码
2018/10/08 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
最简单的vue消息提示全局组件的方法
2019/06/16 Javascript
js判断浏览器的环境(pc端,移动端,还是微信浏览器)
2020/12/24 Javascript
python绘图库Matplotlib的安装
2014/07/03 Python
让python 3支持mysqldb的解决方法
2017/02/14 Python
python中in在list和dict中查找效率的对比分析
2018/05/04 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
利用python开发app实战的方法
2019/07/09 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
Pytorch mask-rcnn 实现细节分享
2020/06/24 Python
使用CSS3实现多列布局与多背景的技巧
2016/02/29 HTML / CSS
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
电子信息专业学生自荐信
2013/11/09 职场文书
职业生涯规划书基本格式
2014/01/06 职场文书
药店主任岗位责任制
2014/02/10 职场文书
中学教师师德承诺书
2014/05/23 职场文书
放牛班的春天观后感
2015/06/01 职场文书
Netty客户端接入流程NioSocketChannel创建解析
2022/03/25 Java/Android