Ir para o conteúdo
Equinox

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

Mensagens Recomendadas

Equinox    0
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

Editado por Equinox
tags code + geshi

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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 ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

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

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    169
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();

Editado por bioshock

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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

Editado por Equinox

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    312
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    169
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();

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    169
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;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Equinox    0
Equinox

Inicializando a BD localmente depois na função e passando apenas o $id funciona. Provavelmente isto está a dar barraca por estar a chamar a função dentro de um while($stmt->fetch()) de outra query. O que interessa é que agora funciona. Quando tiver mais tempo, volto a mergulhar nisto

Obrigado pela tua ajuda ;)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
munkbozz    7
munkbozz

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

Senão estou enganado, falta-te específicar o tipo de parâmetro. PDO::PARAM_INT por exemplo.

$stmt->bind_param("i", $id, PDO::PARAM_INT);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
bioshock    169
bioshock

Senão estou enganado, falta-te específicar o tipo de parâmetro. PDO::PARAM_INT por exemplo.

$stmt->bind_param("i", $id, PDO::PARAM_INT);

PDO != mysqli.

http://net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/

Em mysqli, aquele "i" que ali vês, é do tipo inteiro. Sendo que, para além deste, tens o String (s), Double (d), Blob (b). http://php.net/manual/en/mysqli-stmt.bind-param.php

Editado por bioshock

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.