2010-07-28 11 views
9

Sto solo provando PDO e ottengo questo errore, errore irreversibile: chiama una funzione membro fetch() su un oggetto non oggetto, ma non è già sull'oggetto $ this-> db?PDO: chiama una funzione membro fetch() su un non oggetto?

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); 

    } 

} 

risposta

1

Direi che la query non è in esecuzione a causa di sintassi non corretta. Dovresti controllare la funzione statica errorinfo di PDO per vedere se la query è errata o meno.

Ecco un potenziale istruzione SQL corretta:

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

Credo tempo è una parola riservata in MySQL mi consiglia di utilizzare un nome diverso, ma incassa in backticks allevierà tale questione. 1 segno uguale è usato per mysql, non due. Ma sì, guarda nella funzione errorinfo per determinare se la tua query è fallita a causa di un errore di sintassi e gestirla con garbo.

+0

Se si utilizzano le parole riservate di Microsoft SQL Server vengono utilizzate nel modo [orario]. – Crypth

17

Guardate attentamente la documentazione per PDO::query, in particolare la sezione "Valori di Ritorno":

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

Il bit importante è "FALSE in caso di fallimento". FALSE non è un oggetto, quindi chiamare -> fetch() è una cattiva notizia.

L'errore è probabilmente dovuto all'utilizzo dell'operatore di confronto "==". In SQL, è solo "=".

Si consiglia di verificare che il $sql_shouts non è falso, e poi fare qualcosa di intelligente con l'errore, se ci fosse 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 per l'ottima informazione/descrizione. Ben scritto e descritto. –

-1

Succede quando la tabella non esiste anche. assicurarsi che esista effettivamente, e non è solo un titolare nel database a causa di errori del disco rigido.

Quando ciò accade, suggerisco di ricreare il database/la tabella.

-1

Ho ricevuto questo messaggio di errore a causa di un errore stupido con parentesi. È stato inserito all'interno di un'istruzione if e non l'ha visto.

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

Mi ci è voluto un po 'per capire che non ho chiuso la parentesi db_query nel posto giusto. Forse aiuta qualcun altro a fissare questa meraviglia. Corretto:

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