PDO ofrece tres estrategias diferentes de manejar errores, para adaptarse a su estilo de desarrollo de aplicaciones.
PDO::ERRMODE_SILENT
Este es el modo predeterminado. PDO simplemente establecerá él mismo el código de error para su inspección usando los métodos PDO::errorCode() y PDO::errorInfo() tanto en objetos de sentencias como de bases de datos. Si el error resultó de una llamada sobre un objeto de sentencia, se deberá invocar al método PDOStatement::errorCode() o PDOStatement::errorInfo() sobre dicho objeto. Si el error resultó de una llamada sobre un objeto de bases de datos, se deberá invocar, en su lugar, a los métodos del objeto de bases de datos.
PDO::ERRMODE_WARNING
Además de establecer el código de error, PDO emitirá un mensaje E_WARNING tradicional. Esta configuración es útil durante la depuración o las pruebas, si lo que se quiere es ver qué problemas han ocurrido, sin interrumpir el flujo de la aplicación.
PDO::ERRMODE_EXCEPTION
Además de establecer el código de error, el PDO lanzará una excepción de tipo PDOException y establecerá sus propiedades para reflejar el error y la información del mismo. Esta configuración también es útil durante la depuración, ya que, de hecho, señalará el lugar del error del script, apuntando a áreas pontencialmente problemáticas del código (recuerde: las transacciones son automáticamente revertidas si la excepción causa que finalice el script).
El modo 'Exception' también es útil porque se puede estructurar el manejo de errores con más claridad que con el estilo tradicional de advertencias de PHP, y con menos código/anidación que con la ejecución en modo silencioso y comprobando explícitamente el valor devuelto de cada llamada a la base de datos.
Véase la referencia de Excepciones para más información sobre Excepciones en PHP.
PDO utiliza el estándar de cadenas de códigos de error SQLSTATE de SQL-92; cada controlador de PDO es responsable de hacer que correspondan su códigos nativos con los códigos SQLSTATE apropiados. El método PDO::errorCode() devuelve un único código SQLSTATE. Si fuera necesaria más información específica sobre el error, PDO también ofrece el método PDO::errorInfo(), que devuelve un array que contiene el código SQLSTATE, el código de error específico del controlador, y la cadena de error específica.
Ejemplo #1 Crear una instancia de PDO y establecer el modo de error
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$usuario = 'usuario';
$contraseña = 'contraseña';
try {
$gbd = new PDO($dsn, $usuario, $contraseña);
$gbd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Falló la conexión: ' . $e->getMessage();
}
?>
Nota:
PDO::__construct() siempre lanzará una PDOException si la conexión falla independientemente de que
PDO::ATTR_ERRMODE
esté actualmente esteblecido. Excepciones no capturadas son fatales.
Ejemplo #2 Crear una instancia PDO y establecer el modo de error desde el constructor
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'usuario';
$password = 'contraseña';
/*
Usando try/catch en el constructor sigue siendo válido aunque se establezca ERRMODE a WARNING desde
PDO::__construct siempre lanzará una PDOException si la conexión falla.
*/
try {
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
} catch (PDOException $e) {
echo 'Error de conexión: ' . $e->getMessage();
exit;
}
// Esto hará que PDO lance un error de nivel E_WARNING en lugar de una excepción (cuando la tabla no exista)
$dbh->query("SELECT columnaincorrecta FROM tablaincorrecta");
?>
El resultado del ejemplo sería:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.tablaincorrecta' doesn't exist in /tmp/pdo_test.php on line 18