Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Prática recomendada para tratamento de erros usando PDO


Essa é uma pergunta muito boa, mas há uma premissa errada no início:você está separando o relatório de erros para PDO do relatório de erros em todo o site. O que faz muito pouco sentido:erros de PDO em todos os sentidos são os mesmos que outros erros - erros de sistema de arquivos, erros de HTTP e assim por diante. Assim, não há razão para estabelecer relatórios de erros somente PDO. Tudo o que você precisa é definir corretamente o relatório de erros em todo o site.

Há também uma suposição errada em relação à inacessibilidade do php.ini:você sempre pode definir qualquer diretiva de configuração usando a função ini_set(). Portanto, aqui não há um único motivo para definir error_reporting para o nível desastroso de 0.

Para responder ao resto de suas perguntas, tudo que você precisa é de um pouco de bom senso.

O que você pensa a si mesmo? É bom mostrar mensagens de erro do sistema para o usuário? É bom mostrar os componentes internos do sistema para um usuário mal-intencionado?

Você tem alguma objeção a isso?

Você não acha que é uma ideia bastante contraditória - registrar erros de banco de dados no banco de dados?

Você já mostrou:exiba em dev e faça login em prod. Tudo é controlado em todo o site através de algumas opções de configuração simples.

NÃO use o bloco try-catch para relatórios de erros. Você não vai escrever um bloco catch com uma mensagem de erro amigável para cada consulta em seu aplicativo , como é sugerido na outra resposta, você está?

Assim, seu código deve ser
<?php
  // Error handling
  error_reporting(-1);
  ini_set('display_errors',0);
  ini_set('log_errors',1);

  // Get credentials from outside document root
  require_once('../settings.php');

  // Tests connection to database
    $dbh = new PDO(
            sprintf(
              'mysql:host=%s;dbname=%s;port=%s;charset=%s',
              $settings['host'],
              $settings['name'],
              $settings['port'],
              $settings['charset']
            ),
            $settings['username'],
            $settings['password']
    );
    // Prevents emulated prepares and activates error handling
    // PDO::ERRMODE_EXCEPTION
    $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Agora para a pergunta que você expressou no comentário.

Uma tela de erro personalizada é uma questão muito diferente e seu código é especialmente ruim com ela. Nem deve ser um erro 404 nem um redirecionamento HTTP deve ser usado (isso é muito ruim para SEO).

Para criar uma página de erro personalizada, você deve usar os recursos do servidor web (preferencial) ou um manipulador de erros no script PHP.

Ao encontrar um erro fatal (e uma exceção não capturada), o PHP responde não com o status HTTP 200 OK, mas com o status 5xx. E cada servidor web pode pegar este status e mostrar uma página de erro correspondente. Por exemplo. para o Apache seria
ErrorDocument 503 server_error.html

onde você pode escrever as desculpas que quiser.

Ou você pode configurar um manipulador de erros personalizado em PHP que também lidaria com todos os erros do PHP, um exemplo pode ser visto no artigo que escrevi sobre o assunto:O (im)uso adequado de try..catch.