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
O PDO oferece a você a escolha entre 3 estratégias diferentes de manipulação de erros, para se adequar ao seu estilo de desenvolvimento de aplicativos.
PDO::ERRMODE_SILENT
Antes do PHP 8.0.0, este era o modo padrão. O PDO simplesmente define o código de erro para você para inspecionar usando os métodos PDO::errorCode() e PDO::errorInfo() tanto nos objetos de instrução quanto no banco de dados; se o erro resultasse de uma chamada em um objeto de instrução, você invocaria o método PDOStatement::errorCode() ou PDOStatement::errorInfo() nesse objeto. Se o erro resultasse de uma chamada no objeto de banco de dados, você invocaria esses métodos no objeto de banco de dados em vez disso.
PDO::ERRMODE_WARNING
Além de definir o código de erro, o PDO emitirá uma mensagem de E_WARNING tradicional. Esta configuração é útil durante a depuração/teste, se você apenas quiser ver quais problemas ocorreram sem interromper o fluxo do aplicativo.
PDO::ERRMODE_EXCEPTION
A partir do PHP 8.0.0, este é o modo padrão. Além de definir o código de erro, o PDO lançará um PDOException e definirá suas propriedades para refletir o código de erro e o informações de erro. Esta configuração também é útil durante a depuração, pois irá efetivamente "explodir" o script no ponto do erro, muito rapidamente apontando um dedo para áreas problemáticas potenciais em seu código (lembre-se: as transações são automaticamente revertidas se a exceção faz com que o script termine).
O modo de exceção também é útil porque você pode estruturar sua manipulação de erros de forma mais clara do que com avisos no estilo tradicional do PHP e com menos código/aninhamento do que em modo silencioso e explicitamente verificando o valor de retorno de cada chamada de banco de dados.
Veja Exceções para mais informações sobre Exceções em PHP.
O PDO padroniza o uso de strings de código de erro SQLSTATE SQL-92; individualmente Os drivers do PDO são responsáveis por mapear seus códigos nativos para os códigos SQLSTATE apropriados. O método PDO::errorCode() retorna um único código SQLSTATE. Se você precisar de informações mais específicas sobre um erro, o PDO também oferece um método PDO::errorInfo() que retorna uma matriz contendo o código SQLSTATE, o código de erro específico do driver e o driver string de erro específico.
Exemplo #1 Criar uma instância do PDO e definir o modo de erro
<?php
$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Isso fará com que o PDO lance uma PDOException (quando a tabela não existe)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
O exemplo acima produzirá:
Fatal error: Uncaught PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'testdb.wrongtable' doesn't exist in /tmp/pdo_test.php:10 Stack trace: #0 /tmp/pdo_test.php(10): PDO->query('SELECT wrongcol...') #1 {main} thrown in /tmp/pdo_test.php on line 10
Nota:
PDO::__construct() sempre lançará uma PDOException se a conexão falhar independentemente de qual
PDO::ATTR_ERRMODE
estiver atualmente definido.
Exemplo #2 Criar uma instância do PDO e definir o modo de erro a partir do construtor
<?php
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'googleguy';
$password = 'googleguy';
$dbh = new PDO($dsn, $user, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING));
// Isso fará com que o PDO lance um erro de nível E_WARNING em vez de uma exceção (quando a tabela não existe)
$dbh->query("SELECT wrongcolumn FROM wrongtable");
O exemplo acima produzirá:
Warning: PDO::query(): SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.wrongtable' doesn't exist in /tmp/pdo_test.php on line 9
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.