Jump to content
Equinox

O mítico "Fatal error: Call to a member function bind_param() on a non-object"

Recommended Posts

Equinox

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.

Tenho esta função:

function getusernamebyid($id, mysqli $db) {
      $query = "SELECT username FROM users WHERE id=?";
      $stmt = $db->prepare($query);
      $stmt->bind_param("i", $id);
      $stmt->execute();
      $stmt->bind_result($username);
      while($stmt->fetch()) {
          return $username;
      }
      $stmt->close();
}

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?

Obrigado, cumprimentos

Edited by Equinox
tags code + geshi

Share this post


Link to post
Share on other sites
HappyHippyHippo

function getusernamebyid($id, mysqli $db) {

tens o protótipo da função assim mesmo, sem tirar nem por ? mesmo com aquele mysqli ali perdido pelo meio ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Equinox

function getusernamebyid($id, mysqli $db) {

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.

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz esta alteração e diz se te apresenta alguma informação de erro:

$stmt = $db->prepare($query);
if (!$stmt) {
   echo "\nPDO::errorInfo():\n";
   print_r($dbh->errorInfo());
} else {
   $stmt->bind_param("i", $id);
   // ...
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Equinox

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

Obrigado pela ajuda ;)

Share this post


Link to post
Share on other sites
HappyHippyHippo

$stmt = $db->prepare($query);
if (!$stmt) {
   echo "\nPDO::errorInfo():\n";
   print_r($db->errorInfo());
//            A
//            |
} else {
   $stmt->bind_param("i", $id);
   // ...
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
bioshock

http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html

Dito isto, experimenta:

$query = $db->prepare("SELECT username FROM users WHERE id=?");
$query->bind_param("i", $id);
$query->execute();
$query->store_result();
$query->bind_result($username);
$query->fetch();
/*
* Se pretendes que te retorne um resultado único, utiliza a função num_rows(), caso contrário faz o ciclo à função fetch()
*/
if($query->num_rows() == 1){
  return $username;
}
$query->close();

Edited by bioshock

Share this post


Link to post
Share on other sites
Equinox

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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 !!!


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Equinox

? 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 by Equinox

Share this post


Link to post
Share on other sites
Equinox

function getusernamebyid($id, $db) {
	$query = "SELECT username FROM users WHERE id=?";
	$stmt = $db->prepare($query);
	if(!$stmt) {
		echo $db->error;
	}
	else {
		$stmt->bind_param("i", $id);
		$stmt->execute();
		$stmt->store_result();
		$stmt->bind_result($username);
		$stmt->fetch();
		if($stmt->num_rows() == 1) {
			return $username;
		}
		$stmt->close();
	}
}

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.

Share this post


Link to post
Share on other sites
Rui Carlos

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.

Share this post


Link to post
Share on other sites
bioshock

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

$host = "localhost";
$user = "root";
$pwd = "";
$databse = "exemplo";

$db = new mysqli($host, $user, $pwd, $database);

if ($db->connect_errno) {
  printf("Erro ao connectar: " . $db->connect_error);
  return false;
  exit();
}


$query = $db->prepare("SELECT username FROM users WHERE id=?");
$query->bind_param("i", $id);
$query->execute();
$query->store_result();
$query->bind_result($username);
$query->fetch();

if($stmt->num_rows() == 1) {
return $username;
}
$stmt->close();

Share this post


Link to post
Share on other sites
Equinox

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

Share this post


Link to post
Share on other sites
bioshock

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.

if(!$query->execute()){
  echo $db->error;
}

Share this post


Link to post
Share on other sites
Equinox

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.