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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
PHP防止跨域提交表单
Nov 01 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
Dec 24 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
PHP实现的简单网络硬盘
Jul 29 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
Nov 02 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 PHP
PHP常用字符串函数用法实例总结
Jun 04 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
MySQL连接数超过限制的解决方法
2011/07/17 PHP
PHP实现通过Luhn算法校验信用卡卡号是否有效
2015/03/23 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
jQuery使用手册之一
2007/03/24 Javascript
用jquery和json从后台获得数据集的代码
2011/11/07 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
jQuery的Each比JS原生for循环性能慢很多的原因
2016/07/05 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
解决微信二次分享不显示摘要和图片的问题
2017/08/18 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
vuejs使用$emit和$on进行组件之间的传值的示例
2017/10/04 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
vue多次循环操作示例
2019/02/08 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
Python logging管理不同级别log打印和存储实例
2018/01/19 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
python修改文件内容的3种方法详解
2019/11/15 Python
如何在django中添加日志功能
2020/02/06 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
泰国汽车、火车和轮渡票预订网站:Bus Online Ticket
2017/09/09 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
给校长的建议书600字
2014/05/15 职场文书
法语专业求职信
2014/07/20 职场文书
质量主管工作职责
2014/09/26 职场文书
授权委托书
2015/01/28 职场文书
单位同意报考证明
2015/06/17 职场文书