Sử dụng mã code
thuộc tính của PDOException
để lấy SQLSTATE
. Xem tài liệu cho PDOException
Để kiểm soát SQLSTATE
được tạo bởi một hàm PL / PgSQL gây ra lỗi, bạn sử dụng RAISE ... SQLSTATE
theo tài liệu
.
Tất nhiên, để điều này hoạt động, trình điều khiển cơ sở dữ liệu phải báo cáo chính xác SQLSTATE
. Tôi đã xác minh rằng PDO thực hiện điều này ít nhất trong PHP 5.4.11 với PostgreSQL 9.2, theo mã ví dụ độc lập sau có thể được thực thi với php
dòng lệnh có thể thực thi:
<?php
$pdo = new PDO('pgsql:');
$sql = <<<EOD
CREATE OR REPLACE FUNCTION exceptiondemo() RETURNS void AS $$
BEGIN
RAISE SQLSTATE 'UE001' USING MESSAGE = 'error message';
END;
$$ LANGUAGE plpgsql
EOD;
$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
die("Failed to create test function\n");
}
$sql = "SELECT exceptiondemo();";
$sth = $pdo->prepare($sql);
if (!$sth->execute()) {
$ei = $sth->errorInfo();
die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
// Shortcut way:
// die("Function call failed with SQLSTATE " . $sth->errorCode());
}
?>
Đầu ra là:
Function call failed with SQLSTATE UE001, message ERROR: error message
Thay thế khối mã từ $sth->execute()
thứ hai vào cuối mã với điều này để chứng minh rằng chế độ xử lý ngoại lệ cũng hoạt động tốt:
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$sth->execute();
} catch (PDOException $err) {
$ei = $err->errorInfo;
die("Function call failed with SQLSTATE " . $ei[0] . ", message " . $ei[2] . "\n");
// Alternate version to just get code:
//die("Function call failed with SQLSTATE " . $err->getCode() . "\n");
}