2010-07-28 15 views
9

Estoy probando PDO y me sale este error, Error grave: Llamar a una función miembro fetch() en un objeto no, pero ¿no está ya en el objeto $ this-> db?PDO: ¿Llamar a una función miembro fetch() en un objeto no?

class shoutbox { 

    private $db; 

    function __construct($dbname, $username, $password, $host = "localhost") 
    { # db conections 
     try { 
      $this->db = new PDO("mysql:host=".$hostname.";dbname=".$dbname, $username, $password); 
     } 
     catch(PDOException $e) 
     { 
      echo $e->getMessage(); 
     } 
    } 

    function getShouts() 
    { 
     $sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, time FROM shouts WHERE pmuserid == 0'); 

     return $sql_shouts->fetch(PDO::FETCH_OBJ); 

    } 

} 

Respuesta

1

Yo diría que su consulta no se está ejecutando debido a una sintaxis incorrecta. Debería comprobar realmente la función estática de error de PDO para ver si la consulta tiene errores o no.

Aquí hay un potencial instrucción SQL correcta:

$sql_shouts = $this->db->query('SELECT shoutid, message, pmuserid, ipadress, `time` FROM shouts WHERE pmuserid = 0');

Creo que el tiempo es una palabra reservada en MySQL yo recomendaría usar un nombre diferente, pero encerrando entre comillas sencillas que aliviará esa cuestión. 1 signo igual se usa para mysql, no dos. Pero sí, busque en la función errorinfo para determinar si su consulta falló debido a un error de sintaxis y trátela con elegancia.

+0

Si está utilizando las palabras reservadas de Microsoft SQL Server se utilizan de la manera [hora]. – Crypth

17

prestar atención a la documentación para PDO::query, en particular la sección "Valores de retorno":

PDO::query() returns a PDOStatement object, or FALSE on failure.

La cosa importante es "en caso de fallo". FALSE no es un objeto, por lo que llamar a -> fetch() es una mala noticia.

El error probablemente se deba al uso del operador de comparación "==". En SQL, es solo "=".

Debe probar que la $sql_shouts no es falsa, y luego hacer algo inteligente con el error, si había uno:

<?PHP 
$sql_shouts = $this->db->query('...'); 
if ($sql_shouts === false){ 
    $errorInfo = $this->db->errorInfo(); 
    //log the error or take some other smart action 
} 
return $sql_shouts->fetch(PDO::FETCH_OBJ); 
+2

+1 para la gran información/descripción. Muy bien escrito y descrito. –

-1

Sucede cuando la tabla no existe también. asegúrese de que realmente exista, y no sea solo un titular en la base de datos debido a errores en el disco duro.

Cuando eso sucede, le sugiero que vuelva a crear la base de datos/tabla.

-1

Recibí este mensaje de error debido a un error tonto entre corchetes. Estaba anidado dentro de una declaración if y simplemente no lo veía.

db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var)->fetchField()); 

Me tomó un tiempo darme cuenta de que no cerré el soporte db_query en el lugar correcto. Tal vez le ayude a alguien más mirando esta maravilla wth. Correcto:

db_query("SELECT thing FROM table WHERE var=:var", array(":var" => $var))->fetchField(); 
Cuestiones relacionadas