mysqli_fetch_assoc () espera erros de parâmetro / chamada para uma função membro bind_param (). Como obter o erro real do mysql e corrigi-lo?
No meu ambiente local / de desenvolvimento, a consulta MySQLi está funcionando bem. No entanto, quando eu faço upload no meu ambiente de host da web, recebo este erro:
Erro fatal: chamada a uma função membro bind_param () em um objeto não 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 a minha consulta, tentei executar a consulta através do painel de controle phpMyAdmin e o resultado é bom.
Respostas
Às vezes o seu código MySQLi produz um erro como mysqli_fetch_assoc() expects parameter...
, Call to a member function bind_param()...
ou similar. Ou até sem nenhum erro, mas a consulta não funciona da mesma forma. Isso significa que sua consulta falhou ao executar.
Cada vez que uma consulta falha, o MySQL exibe 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 é uma mensagem de erro enigmática mencionada acima. Portanto, é muito importante configurar o PHP e o MySQLi para relatar erros do MySQL para você. E assim que receber a mensagem de erro, consertá-la será moleza.
Como obter a mensagem de erro no MySQLi?
Em primeiro lugar, sempre tenha esta linha antes de conectar o MySQLi 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. A exceção não detectada, por sua vez, causa um erro fatal do PHP. Portanto, no caso de um erro do MySQL, você obterá um erro de PHP convencional. Isso o deixará imediatamente ciente da causa do erro. E um rastreamento de pilha o levará ao local exato onde ocorreu o erro.
Como configurar o PHP em diferentes ambientes
Aqui está um resumo do meu artigo sobre relatórios de erros de PHP :
Relatórios de erros em servidores de desenvolvimento e ativos devem ser diferentes. Em um servidor de desenvolvimento, é conveniente que os erros sejam exibidos na tela, mas em um servidor ativo, as mensagens de erro devem ser registradas, para que você possa encontrá-los no log de erros posteriormente.
Portanto, você deve definir as opções de configuração correspondentes para os seguintes valores:
Em um servidor de desenvolvimento
error_reporting
deve ser definido comoE_ALL
valor;log_errors
deve ser definido como 1 (é conveniente ter registros em um PC de desenvolvimento também)display_errors
deve ser definido como 1
Em um servidor de produção
error_reporting
deve ser definido comoE_ALL
valor;log_errors
deve ser definido como 1display_errors
deve ser definido como 0
Como realmente usá-lo?
Basta remover qualquer código que verifica o erro manualmente , todos aqueles or die()
, if ($result)
e tais. Simplesmente escreva seu código de interação de banco de dados imediatamente:
$stmt = $this->con->prepare("INSERT INTO table(name, quantity) VALUES (?,?)");
$stmt->bind_param("si", $name, $quantity);
$stmt->execute();
novamente, sem quaisquer condições ao redor . Se ocorrer um erro, ele será tratado como qualquer outro erro em seu código. Por exemplo, em um PC de desenvolvimento, ele aparecerá apenas na tela, enquanto em um site ao vivo será registrado para um programador, enquanto para a conveniência do usuário você pode usar um gerenciador de erros (mas isso é uma história diferente que está fora do tópico para MySQLi, mas você pode ler sobre isso no artigo no link acima).
O que fazer com a mensagem de erro que você recebe?
Em primeiro lugar, você deve localizar a consulta do problema. A mensagem de erro contém o nome do arquivo e o número da linha do local exato onde ocorreu o erro. Para o código simples, isso é o suficiente, mas se o seu código estiver usando funções ou classes, pode ser necessário seguir o rastreamento da pilha para localizar a consulta do problema.
Depois de receber a mensagem de erro, você deve lê-la e compreendê-la. Parece muito óbvio, se não condescendente, mas os alunos muitas vezes ignoram o fato de que a mensagem de erro não é apenas um sinal de alarme, mas na verdade contém uma explicação detalhada do problema . E tudo que você precisa é ler a mensagem de erro e corrigir o problema.
- Digamos que, se disser que uma determinada tabela não existe, você deverá verificar a ortografia, os erros de digitação e a caixa das letras. 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á logo antes da parte da consulta citada na mensagem de erro.
Se você não entender a mensagem de erro, tente pesquisar no Google. E ao navegar pelos resultados, atenha-se às respostas que explicam o erro, em vez de fornecer a solução sem rodeios. Uma solução pode não funcionar em seu caso específico, mas a explicação o ajudará a entender o problema e torná-lo capaz de corrigi-lo sozinho.
Você também deve confiar na mensagem de erro. Se disser que o número de tokens não corresponde ao número de variáveis associadas, então é verdade . O mesmo se aplica às tabelas ou colunas ausentes. Dada a escolha, seja seu próprio erro ou a mensagem de erro está errada, sempre opte pelo primeiro. Mais uma vez, parece condescendente, mas centenas de perguntas neste mesmo site provam que este conselho é extremamente útil.
Uma lista de coisas que você nunca deve fazer em relação ao relatório de erros
- Nunca use um operador de supressão de erros (
@
)! Isso torna o programador incapaz de ler a mensagem de erro e, portanto, incapaz de corrigir o erro - Não use
die()
ouecho
ou qualquer outra função para imprimir a mensagem de erro na tela incondicionalmente. O PHP pode relatar erros por si só e fazê-lo da maneira certa depende do ambiente - então deixe para o PHP. - Não adicione uma condição para testar o resultado da consulta manualmente (como
if($result)
). Com as exceções de erro habilitadas, tal condição será simplesmente inútil. - Não use o
try..catch
operador para ecoar a mensagem de erro. Este operador deve ser usado para executar algum tratamento de erro, como uma reversão de transação. Mas nunca use-o apenas para relatar erros - como aprendemos acima, o PHP já pode fazer isso da maneira certa.
PS
Às vezes não há erro, mas também não há resultados. Isso significa que não há dados no banco de dados que correspondam aos seus critérios . Nesse caso, 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. Eu tenho um artigo que pode ajudar neste assunto, Como depurar interações de banco de dados . Embora seja escrito para PDO, mas o princípio é o mesmo. Basta seguir esta instrução passo a passo e resolver o problema ou ter uma pergunta para o Stack Overflow.