/ / Como obter informações de erro do MySQLi em diferentes ambientes - php, mysqli, instruções preparadas, ambiente, relatório de erros

Como obter informações de erro do MySQLi em diferentes ambientes - php, mysqli, instruções preparadas, ambiente, relatório de erros

No meu ambiente local / desenvolvimento, a consulta do MySQLi está funcionando OK. No entanto, quando eu carrego no meu ambiente de host, recebo este erro:

Erro fatal: Chame para uma função de membro bind_param () em um não-objeto em ...

Aqui está o código:

global $mysqli;
$stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?");
$stmt->bind_param("i", $cur_id);
$stmt->execute();
$stmt->bind_result($uid, $desc);

Para verificar minha consulta, tentei executar a consulta via painel de controle phpMyAdmin e o resultado está OK.

Respostas:

63 para resposta № 1

Primeiro de tudo, sempre tem essa linha antes do MySQLi conectar todos seus ambientes:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

Depois disso, todos os erros do MySQL serão transferidosem exceções do PHP. A exceção não capturada, por sua vez, causa um erro fatal do PHP. Assim, no caso de um erro do MySQL, você receberá um erro convencional do PHP. Isso fará com que você fique imediatamente ciente da causa do erro. Um rastreamento de pilha o levará ao local exato onde ocorreu o erro.

Note que você tem que ser capaz de ver Erros do PHP em geral. E aqui vai a questão de diferentes ambientes:

  • Em um site ao vivo, você tem que dar uma olhada nos logs de erros, então, as configurações precisam ser

    error_reporting(E_ALL);
    ini_set("display_errors", 0);
    ini_set("log_errors", 1);
    
  • Enquanto em um servidor de desenvolvimento local, é OK fazer erros na tela:

    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    

E uma pequena lista do que você não deveria:

  • Use o operador de supressão de erros (@)
  • Usar die() ou echo ou qualquer outra função para imprimir a mensagem de erro na tela incondicionalmente. PHP pode ecoar tudo bem já, nenhuma assistência é necessária.
  • Testando o resultado da consulta manualmente (como if($result)) não faz sentido. Ou sua consulta falhou e você já terá a exceção de erro, ou tudo correu bem e não há nada para testar.
  • Use try..catch para ecoar a mensagem de erro. Novamente PHP pode fazer melhor, muito melhor.