2011-02-25 23 views
25

Estoy intentando ejecutar algunas consultas para obtener una página de información sobre algunas imágenes. He escrito una funciónError grave: llamar a una función miembro fetch_assoc() en un objeto no

function get_recent_highs($view_deleted_images=false) 
{ 
    $lower = $this->database->conn->real_escape_string($this->page_size * ($this->page_number - 1)); 
    $query = "SELECT image_id, date_uploaded FROM `images` ORDER BY ((SELECT SUM(image_id=`images`.image_id) FROM `image_votes` AS score)/(SELECT DATEDIFF(NOW() , date_uploaded) AS diff)) DESC LIMIT " . $this->page_size . " OFFSET $lower"; //move to database class 
    $result = $this->database->query($query); 
    $page = array(); 
    while($row = $result->fetch_assoc()) 
    { 
     try 
     { 
      array_push($page, new Image($row['image_id'], $view_deleted_images)); 
     } 
     catch(ImageNotFoundException $e) 
     { 
      throw $e; 
     } 
    } 
    return $page; 
} 

que selecciona una página de estas imágenes según su popularidad. Escribí una clase Database que maneja las interacciones con la base de datos y una clase Image que contiene información sobre una imagen. Cuando intento ejecutar esto obtengo un error.

Fatal error: Call to a member function fetch_assoc() on a non-object 

$result es un conjunto de resultados mysqli, así que estoy desconcertado en cuanto a por qué esto no está funcionando.

+0

var_dump on $ result ¿confirma que es un conjunto de resultados mysqli? – erisco

Respuesta

34

Esto se debe a que se ha producido un error en la consulta. MySQli->query() devolverá falso por error. Cambiarlo a algo como ::

$result = $this->database->query($query); 
if (!$result) { 
    throw new Exception("Database Error [{$this->database->errno}] {$this->database->error}"); 
} 

Eso debería lanzar una excepción si hay un error ...

+2

'Error fatal: usando $ this cuando no está en el contexto del objeto' – User

10

Probablemente su consulta falló, y la llamada de consulta devolvió un booleano FALSE (o un objeto de error de algún tipo), que luego intenta utilizar como si fuera un objeto de conjunto de resultados, lo que provoca el error. Pruebe algo como var_dump($result) para ver lo que realmente tiene.

Compruebe si hay errores después de CADA consulta de base de datos. Incluso si la consulta en sí es sintácticamente válida, existen demasiados motivos para que falle de todos modos; la comprobación de errores siempre le ahorrará mucho dolor en algún momento.

3

que sucede a la falta de espacios en mi consulta y viene este error.

Ex: $sql= "SELECT * FROM"; 
$sql .= "table1"; 

Aunque el ejemplo podría parecer simple, al codificar las consultas complejas, la probabilidad de que este error es alta. Me faltaba espacio antes de la palabra "mesa1".

0

Compruebe si ya ha cerrado la conexión de la base de datos o no. En mi caso, recibí el error porque la conexión estaba cerca en la línea superior.

+1

Compruebe si ya hay una respuesta aceptada a una pregunta de siete (!) Años que le diga exactamente lo mismo –

Cuestiones relacionadas