O mítico "Fatal error: Call to a member function bind_param() on a non-object" - PHP - Portugal-a-Programar
O mítico "Fatal error: Call to a member function bind_param() on a non-object"
By Equinox, November 15, 2013 in PHP
Boas, pessoal. Agradecia aqui uma ajuda. Já várias vezes me deparei com este erro, mas agora, não sei se pelo cansaço ou outra coisa qlq, não está a ir nem por nada.
function getusernamebyid($id, mysqli $db) {
$query = "SELECT username FROM users WHERE id=?";
Noutro ficheiro, tenho:
$mydb = new mysqli("localhost", "root", "", "mydb");
$username = getusernamebyid($user_id, $mydb); //entretanto obtive também o id
Ao correr isto, dá-me que o erro está na linha do "$stmt->bind_param("i", $id);"
Acho que não estou a usar nenhuma keyword do sql, testo a query manualmente, retorna o resultado esperado...
Alguma hint?
Edited November 16, 2013 by Equinox
tens o protótipo da função assim mesmo, sem tirar nem por ? mesmo com aquele mysqli ali perdido pelo meio ?
Yup. Com ou sem, o erro é o mesmo.
faz esta alteração e diz se te apresenta alguma informação de erro:
Diz que o método errorInfo não está definido. Fiz echo de $db->error e diz-me que "Commands are out of sync; you can't run this command now". Isto deve-se a, em alguma outra função, não ter feito $stmt->close() ? Hmm
Edited November 15, 2013 by HappyHippyHippo
Testei logo com isso...
Não falta aí o store_result?
Para quê usar o store_result se já estou a fazer bind_result($username) ?
Dito isto, experimenta:
$query = $db->prepare("SELECT username FROM users WHERE id=?");
$query->bind_result($username);
* Se pretendes que te retorne um resultado único, utiliza a função num_rows(), caso contrário faz o ciclo à função fetch()
Edited November 16, 2013 by bioshock
Continua sem funcionar. Mas que magia negra é que está aqui? lol
Btw, bioshock, sempre que quiser retornar data "directamente" devo usar o store_result? Digo isto, pq até agora não tenho feito e tem tudo funcionado. Aliás, tenho uma função definida antes da que está a dar problemas (getidbyusername) que é exactamente o inverso da outra e funciona bem
dizer que não funciona não é apresentar um problma que possa ser resolvido
- qual o código que tens agora
- e o mais importante de tudo QUAL O ERRO !!!
? Mas que entrada a pé juntos foi essa agora?
Disse que o erro que me dava era o "Commands out of sync (...)", o bioshock tentou ajudar e como o mesmo erro persistiu, disse que continuava sem funcionar. Parece-me lógico. O código que estou a usar é irrevelante, pois continua sem funcionar com ambas as soluções, ou melhor, continua a dar o erro "Commands out of sync; you can't run this command now"
Edit: Como quando tenho um problema não espero que mo resolvam, só meti aqui pq apesar de já me ter acontecido, das outras vezes consegui resolver e o facto de agora isto não desaparecer nem por nada é que me levou a perguntar se alguém já tinha tido algo semelhante. Experimento algumas soluções que leio na net sobre isto em específico e, no meu caso, não tem resolvido
Edited November 17, 2013 by Equinox
o código é sempre relevante ...
function getusernamebyid($id, $db) {
if($stmt->num_rows() == 1) {
Está assim, com a tentativa de solução do bioshock. Sem o if-else continua a dar o fatal error, com o if-else dá o erro dos Commands coise e tal.
Diz que o método errorInfo não está definido. Fiz echo de $db->error e diz-me que "Commands are out of sync; you can't run this command now".
Se obténs essa mensagem, é porque !stmt é verdadeiro, certo? Ou seja, a chamada ao prepare está a falhar. Assim sendo, diria que o problema está deve estar no $db.
Sim, é o mais provável. Experimenta mandar um output do valor da variável $db.
E para tirar as teimas:
// troca para os teus valores
$databse = "exemplo";
$db = new mysqli($host, $user, $pwd, $database);
printf("Erro ao connectar: " . $db->connect_error);
bioshock, depois de experimentar o teu código, além do erro no bind_param(..) não manda mais output nenhum lol ou seja, não há erro na ligação à db
O problema pode advir dos dados que estás a passar por parâmetros. Experimenta colocar o código que te dei num ficheiro à parte. Mais, verifica se há erro no execute.
Funcionou... o.O
Num ficheiro à parte, funciona. Como é que é possível? Eu na minha solução, na função que defini, apenas passo como params o $id (que está definido, pois com echo dá o valor correcto) e a $db, o código dentro da função é exactamente o mesmo e dá aquele erro estúpido.