Note that if you’re executing an SQL command containing multiple statements, PDO by default will not be able to correctly report errors in one of them.
More info (and a workaround) in this bug report: https://bugs.php.net/bug.php?id=61613
PDO ofrece tres estrategias diferentes de manejar errores para adaptarse a cualquier 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 utilizando 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 a 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 a 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 realización de pruebas para visualizar los problemas que han ocurrido sin interrumpir el flujo de la aplicación.
PDO::ERRMODE_EXCEPTION
Además de establecer el código de error, PDO lanzará una 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 potencialmente problemáticas del código (recuerde: las transacciones son automáticamente revertidas si la excepción causa la finalización del 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, comprobando así 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 las cadenas de código de error SQLSTATE del estándar SQL-92; cada controlador de PDO es responsable de la correspondencia de 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=prueba;host=127.0.0.1';
$usuario = 'usuario';
$contraseña = 'contraseña';
try {
$mbd = new PDO($dsn, $usuario, $contraseña);
$mbd->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é esteblecido. Las excepciones no capturadas son fatales.
Ejemplo #2 Crear una instancia de PDO y establecer el modo de error desde el constructor
<?php
$dsn = 'mysql:dbname=prueba;host=127.0.0.1';
$usuario = 'usuario';
$contraseña = 'contraseña';
/*
El empleo de try/catch en el constructor sigue siendo válido aunque se establezca ERRMODE a WARNING,
ya que PDO::__construct siempre lanzará una PDOException si la conexión falla.
*/
try {
$mbd = new PDO($dsn, $usuario, $contraseña, 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)
$mbd->query("SELECT columna_incorrecta FROM tabla_incorrecta");
?>
El resultado del ejemplo sería:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'prueba.tabla_incorrecta' doesn't exist in /tmp/prueba_pdo.php on line 18
Note that if you’re executing an SQL command containing multiple statements, PDO by default will not be able to correctly report errors in one of them.
More info (and a workaround) in this bug report: https://bugs.php.net/bug.php?id=61613
Setting the PDO::ATTR_ERRMODE to PDO::ERRMODE_EXCEPTION applies to both PDO and PDO::PDOStatement objects. Also, exceptions are thrown by: PDO::beginTransaction(), PDO::prepare(), PDOStatement::execute(), PDO::commit(), PDOStatement::fetch(), PDOStatement::fetchAll() and so on... Some of these are specified in their respective documentations as to return 'false' in case of an error.