2010-12-06 15 views
0

Fatal error: Call auf eine Elementfunktion vorbereiten() auf einem Nicht-ObjektPHP PDO: Aufruf einer Memberfunktion prepare() & list?

Ist das, was ich bekomme, wenn ich versuche zu tun:

$sql = $connect->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE $user_cond AND banned = 0"); // SELECT 
$sql->execute(); 
$sql->setFetchMode(PDO::FETCH_ASSOC); 
$num = $connect->rowCount(); 

Im mein System halte auf Umschreiben, wobei alle aus mysql_ * und stattdessen pdo verwenden.

Dies ist, was vorher war:

$result = mysql_query("SELECT `id`,`pwd`,`firstname`,`lastname`,`approved`,`user_level` FROM users WHERE 
      $user_cond 
      AND `banned` = '0' 
      ") or die (mysql_error()); 
$num = mysql_num_rows($result); 

Was habe ich falsch gemacht?

Und mit list() Ich habe:

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = mysql_fetch_row($result); 

statt mysql_fetch_row ($ result); Was sollte ich in PDO tun?

Mein PDO Objekt/Verbindung:

try{ 
$connect = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
} 
catch(PDOException $pe) 
{ 
    die('Could connect to the database because: ' .$pe->getMessage()); 

}

Antwort

1

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

in der Regel bedeutet, dass etwas fehlgeschlagen und Ihre Variable ist nicht das, was Sie es erwarten. $connection ist wahrscheinlich false.

PDOStatement::fetch

list($id,$pwd,$firstname,$lastname,$approved,$user_level) = $sql->fetch(); 

Auch rowCount auf der Anweisung aufrufen, nicht auf der Verbindung:

$sql->rowCount(); 
+0

bitte aktualisiert Frage sehen. Ich bekomme keine Fehler für $ connect – Karem

+1

Vielleicht sollten Sie Ihren Code in der Reihenfolge veröffentlichen. Irgendwie wird diese '$ Verbindung' nicht erstellt und was Sie geliefert haben ist nicht genug um herauszufinden, was das Problem ist. –

+0

Könnte es sein, weil $ connect außerhalb der Funktion ist? soll ich es global machen? Ich habe gerade versucht mit global $ connect; nach der $ connect Zeile, behebt nicht das Problem – Karem

0

Der Fehler ist höchstwahrscheinlich aufgrund der MySQL-Verbindung versagt - dafür $connect ist kein gültiges PDO object - wie der Fehler sagt, versuchen Sie, eine Methode für ein Objekt aufzurufen, das sie nicht unterstützt. Wie sieht der Verbindungsbehandlungscode aus? Haben Sie überprüft, ob eine Verbindung erfolgreich erstellt wurde?

+0

Ja bitte siehe aktualisierte Frage, mit der Verbindung – Karem

+0

Sieht gut aus. Hvee hast du versucht, eine var_dump() von $ connect direkt vor dem Aufruf -> prepare() zu machen? PDO kann auf zwei Arten Fehler verursachen: Ausnahmen und Rückgabe Boolean FALSE. Dein Setup könnte die boolesche Version machen, also würde dein catch-Block niemals feuern. –

+0

Ich bekomme "NULL", wenn ich var_dump mache, ist das schlecht? Könnte es sein, weil $ connect außerhalb der Funktion ist? soll ich es global machen? Ich habe gerade versucht mit global $ connect; nach der $ connect-Leitung, behebt das Problem – Karem

1

Da Sie prepare verwenden, sollten Sie den $ cond einen benannten Parameter machen und dann folgendes tun: In diesem Beispiel ist die Bedingung nur user_id, aber Sie können mehrere Bedingungen und mehrere benannte Parameter haben, nur Bind() die gleiche Art und Weise

$sth = $pdo->prepare ("SELECT id, pwd, firstname, lastname, approved, user_level FROM users WHERE user_id = :cond AND banned = 0"); 
$sth->bindParam(':cond', $some_user_id); 
$sth->execute(); 
$a = $sth->fetch(PDO::FETCH_ASSOC); 

die $ a wird Ihre assiciate Array, print_r ($ a) zu sehen, was in ihm

1

wie ein Rahmen Ausgabe aussieht.

Sie ordnen $connect innerhalb einer Funktion, Klasse, Namespace oder bereiten Sie in einer Funktion, Klasse oder Namespace vor?

Wenn Sie innerhalb einer Funktion $connect zuweisen, dann sollte diese Funktion die PDO-Verbindung zurückgeben.Ich würde eine statische Instanz vorstellen wie so:

class Database extends PDO 
{ 
    private $instance = null; 
    public static function Instance() 
    { 
     if(self::$instance == null) 
     { 
      self::$instance = new Database(); 
     } 
     return self::$instance; 
    } 

    private function __construct(){} 
    private function __connect() 
    { 
     try 
     { 
      parent::__construct("mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset:UTF-8", DB_USER, DB_PASS, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)) 
     }catch(PDOException $e) 
     { 
      die($e->getMessage()); 
     } 
    } 
} 

verwenden Sie dann etwa so:

$Database = Database::Instnace(); 

$Database->prepare("..."); 
Verwandte Themen