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?


109

Em 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 de 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.


Podemos ver onde você está iniciando a $mysqlivariável?
Rikesh

Pode ser que seu usuário MySQL não tenha os privilégios para fazer uma SELECTconsulta. Você verificou isso?
Amal Murali

O que vem à mente é que não há nenhum mysqli disponível ou você forneceu credenciais incorretas para se conectar ao MySQL.
NB

@YourCommonSense - Com o título antigo, era mais simples encontrar esta questão para uma referência duplicada.
Paul Spiegel de

@Paul sim, essa é minha preocupação mais profunda também. Mudei o título por causa da pesquisa do Google e do reconhecimento geral, pois para o usuário médio de PHP a conexão entre seu código e diferentes ambientes não é clara. Mas desde então também estou tendo dificuldade em encontrá-lo. Acabar tendo isso nos favoritos. Se você puder propor um título reconhecível, mas relevante, isso seria ótimo
Your Common Sense

Respostas:


123

À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 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 é 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 quando você receber a mensagem de erro, consertá-la será muito fácil.

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á a essência 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_reportingdeve ser definido como E_ALLvalor;
    • 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_reportingdeve ser definido como E_ALLvalor;
    • log_errors deve ser definido como 1
    • display_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 assunto 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, você pode precisar 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 frequentemente 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ê terá que verificar a ortografia, os erros de digitação e as maiúsculas e minúsculas. Além disso, você deve se certificar 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 pela primeira opção. 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()ou echoou 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..catchoperador 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 ter seu problema resolvido ou ter uma pergunta respondível para Stack Overflow.


@AdamWinter usando @ está sempre errado e, neste caso específico, é dez vezes maior. Mensagens de erro para seu programa são o mesmo que uma dor para seu corpo. Diz a você que algo está errado, como sua perna quebrada. E você tem que consertar a perna, não apenas tomar um analgésico e continuar. O MESMO AQUI. PHP diz que não há nenhuma variável que você espera. Então você tem que corrigir o formulário ou qualquer outra coisa, para disponibilizar essa variável. Não basta escrever um código para contornar um erro.
Seu senso comum
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.