Usa el code
propiedad de PDOException
para obtener el SQLSTATE
. Consulte la documentación de PDOException
Para controlar el SQLSTATE
generado por una función PL/PgSQL que genera un error, usa RAISE ... SQLSTATE
según la documentación
.
Por supuesto, para que esto funcione, el controlador de la base de datos debe informar correctamente SQLSTATE
. He verificado que PDO hace esto al menos en PHP 5.4.11 con PostgreSQL 9.2, según el siguiente código de ejemplo independiente que se puede ejecutar con php
ejecutable de línea de comandos:
<?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());
}
?>
La salida es:
Function call failed with SQLSTATE UE001, message ERROR: error message
Reemplace el bloque de código del segundo $sth->execute()
hasta el final del código con esto para demostrar que el modo de manejo de excepciones también funciona bien:
$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");
}