对象方式
PDO 是基于向对象方式,那么错误处理也最好使用面向对象的方式来处理。在 PDOException 中定义了如下方法用于捕获错误信息:
方法 | 说明 |
---|---|
getMessage() | 取得文本化的错误信息 |
getCode() | 取得 SQLSTATE 错误代号 |
getFile() | 取得发生异常的文件名 |
getLine() | 取得 PHP 程序产生异常的代码所在行号 |
getTrace() | backtrace() 数组 |
getTraceAsString() | 取得已格成化成字符串的 getTrace() 信息 |
例子:
<?php try{ //构造PDO连接 $dbh = "mysql:host=localhost;dbname=test"; $db = new PDO($dbh, 'root', 'root123123'); //密码错误 } catch (PDOException $e) { print "错误: ".$e->getMessage()."<br />"; print "行号: ".$e->getLine()."<br />"; die(); } ?>
运行该例子,浏览器输出:
错误: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES) 行号: 5
过程方式
PDO 也支持使用面向过程的方式来处理 PDO 错误。PDO 和 PDOStatement 对象有 errorCode() 及 errorInfo() 方法,如果没有任何错误,errorCode() 返回的是:00000 ,否则就会返回错误代码。
对前面的数据库操作加上错误处理的例子:
//表名错误 $sql = "UPDATE user1 SET email='xiaochen@163.com' WHERE username='小陈'"; $count = $db->exec($sql); if ($db->errorCode() != '00000'){ $error = $db->errorInfo(); echo '错误: [',$error['1'],'] ',$error['2']; die(); } echo '更新 ',$count,' 条数据记录!';
运行该例子,浏览器输出:
错误: [1146] Table 'test.user1' doesn't exist
errorInfo() 方法返回的是一个数组,第一个键值为 SQLSTATE 错误代码,第二个键值为数据库具体的错误代码,第三个为错误文本信息。