PDOException有两种方法可以检索有关错误的信息。在解释PDOException时,我遇到了一个问题,getCode()提供的错误代码毫无意义。我想出了一个方法来使错误代码和消息都更有用。
错误的用户名或密码通常会提供以下内容
代码:0
消息:“SQLSTATE[28000] [1045] Access denied for user 'user'@'example.com' (using password: YES)”
使用我的扩展异常类提供
代码:“28000”
消息:“Access denied for user 'user'@'example.com' (using password: YES)”
<?php
class pdoDbException extends PDOException {
public function __construct(PDOException $e) {
if(strstr($e->getMessage(), 'SQLSTATE[')) {
preg_match('/SQLSTATE\[(\w+)\] \[(\w+)\] (.*)/', $e->getMessage(), $matches);
$this->code = ($matches[1] == 'HT000' ? $matches[2] : $matches[1]);
$this->message = $matches[3];
}
}
}
?>
为了逐步讲解此方法;首先检查消息的开头是否有SQLSTATE文本。如果存在该文本,则解析消息以提取ANSI代码、SQL特定代码和消息。解析后的值存储在其各自的变量中。错误代码变量存储ANSI代码,除非ANSI为'HT000'(未映射的错误代码),否则使用SQL特定代码。
使用此类很简单;与PDO交互时,使用try-catch语句块,如下所示
<?php
try {
$pdo = new PDO($dns, $username, $password, $options);
} catch (PDOException $e) {
throw new pdoDbException($e);
}
?>
现在您可以使用正常的错误方法来检索真实的错误代码和消息。
<?php
echo $err->getCode(); echo $err->getMessage(); ?>
如果您决定使用此代码,请注意错误代码是字符串(与PHP标准错误(为整数)相反),因为某些错误代码是字母数字的。