PDOException 有兩個方法可以擷取有關錯誤的資訊。在解釋 PDOException 時,我遇到一個問題,getCode() 提供的錯誤碼沒有意義。我想出了一種方法,可以讓錯誤碼和訊息都更有用。
錯誤的使用者名稱或密碼通常會提供以下資訊
程式碼:0
訊息:「SQLSTATE[28000] [1045] 使用者 'user'@'example.com' 的存取被拒絕(使用密碼:是)」
使用我的擴充例外類別會提供
程式碼:「28000」
訊息:「使用者 'user'@'example.com' 的存取被拒絕(使用密碼:是)」
<?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 標準錯誤是整數相反),因為某些錯誤碼是字母數字混合的。