Como obter informações de erro do MySQLi em diferentes ambientes

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 function de membro bind_param () em um não-object 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.

Primeiro de tudo, sempre tenha esta linha antes do MySQLi conectar em todos os seus ambientes:

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

Depois disso, todos os erros do MySQL serão transferidos para as exceções do PHP. Exceção não capturada, por sua vez, faz um erro fatal do PHP. Assim, no caso de um erro do MySQL, você receberá um erro convencional do PHP. Isso instantaneamente fará com que você perceba a causa do erro. Um rastreamento de pilha levará você ao local exato onde ocorreu o erro.

Note que você tem que ser capaz de ver erros do PHP em geral . E aqui, de fato, 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 não há problema em fazer erros na canvas:

     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 ( @ )
  • Use die() ou echo ou qualquer outra function para imprimir a mensagem de erro na canvas incondicionalmente. PHP pode ecoar tudo bem já, nenhuma assistência é necessária.
  • Testar o resultado da consulta manualmente (como if($result) ) simplesmente 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.