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

Minha declaração PDO não funciona


Às vezes, seu código PDO produz um erro como Call to a member function execute() ou similar. Ou mesmo sem nenhum erro, mas a consulta não funciona da mesma forma. Isso significa que sua consulta falhou ao ser executada.

Toda vez que uma consulta falha, o MySQL apresenta uma mensagem de erro que explica o motivo . Infelizmente, por padrão, esses erros não são transferidos para o PHP, e tudo o que você tem é um silêncio ou uma mensagem de erro enigmática mencionada acima. Portanto, é muito importante configurar o PHP e o PDO para relatar erros do MySQL. E uma vez que você receber a mensagem de erro, será um acéfalo para corrigir o problema.

Para obter as informações detalhadas sobre o problema, coloque a seguinte linha em seu código logo após conectar
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

(onde $dbh é o nome da sua variável de instância do PDO) ou - melhor - adicione este parâmetro como uma opção de conexão . Depois disso, todos os erros do banco de dados serão traduzidos em exceções PDO que, se deixadas sozinhas, agiriam como erros normais do PHP.

Há uma chance muito pequena de que, no caso de algum erro específico, uma exceção não seja lançada. Se sua query() /prepare() ou execute() chamada retorna false mas não há exceção, verifique o PDO::errorInfo() assim,
 trigger_error("PDO errorInfo: ".$dbh->errorInfo());

Depois de receber a mensagem de erro, você deve lê-la e compreendê-la. Parece óbvio demais, mas os alunos geralmente ignoram o significado da mensagem de erro. No entanto, na maioria das vezes, explica o problema de maneira bastante direta:
  • Digamos que, se disser que uma determinada tabela não existe, você deve verificar a ortografia, erros de digitação, maiúsculas e minúsculas. Além disso, você deve ter certeza de que seu script PHP se conecta a um banco de dados correto
  • Ou, se disser que há um erro na sintaxe SQL, você deve examinar seu SQL. E o ponto do problema está bem antes a parte da consulta citada na mensagem de erro.

Você também precisa confiar a mensagem de erro. Se disser que o número de tokens não corresponde ao número de variáveis ​​vinculadas, então é então. O mesmo vale para tabelas ou colunas ausentes. Dada a escolha, se é seu próprio erro ou a mensagem de erro está errada, sempre atenha-se ao primeiro. Novamente, soa condescendente, mas centenas de perguntas neste mesmo site provam que esse conselho é extremamente útil.

Observe que, para ver os erros do PDO, você precisa ver os erros do PHP em geral. Para fazer isso, você deve configurar o PHP dependendo do ambiente do site:

  • em um desenvolvimento servidor, é muito útil ter erros diretamente na tela, para os quais a exibição de erros deve ser ativada:
    error_reporting(E_ALL);
    ini_set('display_errors',1);
    

  • durante uma live site, todos os erros precisam ser registrados, mas nunca exibidos para o cliente. Para isso, configure o PHP desta forma:
    error_reporting(E_ALL);
    ini_set('display_errors', 0);
    ini_set('log_errors', 1);
    

Observe que error_reporting deve ser definido como E_ALL o tempo todo.

Observe também que, apesar da ilusão comum, nenhum try-catch deve ser usado para o relatório de erros . PHP irá relatar erros de PDO já, e de uma forma muito melhor. Uma exceção não capturada é muito boa para o desenvolvimento, mas se você quiser mostrar uma página de erro personalizada, ainda não use try catch para isso, mas apenas defina um manipulador de erro personalizado . Em poucas palavras, você não precisa tratar os erros de PDO como algo especial, mas considerá-los como qualquer outro erro em seu código.

P.S.
Às vezes não há erro, mas também não há resultados. Isso significa que não há dados que correspondam aos seus critérios . Portanto, você tem que admitir esse fato, mesmo que possa jurar que os dados e os critérios estão corretos. Eles não são. Você tem que verificá-los novamente. Tenho uma resposta curta que ajudaria você a identificar o problema de correspondência, Tendo problemas com linhas correspondentes no banco de dados usando DOP . Basta seguir esta instrução e o tutorial vinculado passo a passo e ter seu problema resolvido ou ter uma pergunta respondida para o Stack Overflow.