Utilisez le code
propriété de PDOException
pour obtenir le SQLSTATE
. Voir la documentation pour PDOException
Pour contrôler le SQLSTATE
généré par une fonction PL/PgSQL générant une erreur, vous utilisez RAISE ... SQLSTATE
selon la documentation
.
Bien sûr, pour que cela fonctionne, le pilote de base de données doit correctement signaler SQLSTATE
. J'ai vérifié que PDO le fait au moins dans PHP 5.4.11 avec PostgreSQL 9.2, selon l'exemple de code autonome suivant qui peut être exécuté avec le php
exécutable en ligne de commande :
<?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 sortie est :
Function call failed with SQLSTATE UE001, message ERROR: error message
Remplacez le bloc de code du deuxième $sth->execute()
à la fin du code avec ceci pour démontrer que le mode de gestion des exceptions fonctionne bien aussi :
$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");
}