PHP Velho Oeste 2024

Erros e manipulação de erros

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

add a note add a note

User Contributed Notes 2 notes

up
0
sylvain dot brunerie at gmail dot com
3 years ago
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
up
-64
Praveen Raj
8 years ago
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.
To Top