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.
php
mysqli
prepared-statement
environment
error-reporting
siopaomana
fonte
fonte
$mysqli
variável?SELECT
consulta. Você verificou isso?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 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:
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_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 1Em 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 0Como 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: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.
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
@
)! Isso torna o programador incapaz de ler a mensagem de erro e, portanto, incapaz de corrigir o errodie()
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.if($result)
). Com as exceções de erro habilitadas, tal condição será simplesmente inútil.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 ter seu problema resolvido ou ter uma pergunta respondível para Stack Overflow.
fonte