2016-07-30 13 views
-1

Jedes Mal, wenn ich versuche, die Abfrage auszuführen es zeigt:Call to undefined Methode verbinden :: prepare()

fatal error: Call to undefined method connect::prepare()

 class connect { 

      private static $instance = null; 
      private $pdo; 

      private function __construct() { 
       try{ 
        $this->pdo = new PDO('mysql:localhost=127.0.0.1;dbname=comment', 'root', ''); 
       } catch(PDOException $e) { 
        die($e->getMessage()); 
       } 
      } 

      public static function getInstance() { 
       if(!isset(self::$instance)) { 
        self::$instance = new connect(); 
       } 
       return self::$instance; 
      } 
     } 

// dies in einer anderen Seite require_once 'connect.php';

class users { 
    public $pdo; 

    public function __construct() { 
     $this->pdo = connect::getInstance(); 
    }  



    public function insertComment($user_id, $comment_text, $time) { 

     $sql = "INSERT INTO comments VALUES ('','$user_id', '$comment_text', '$time')"; 
     $this->query = $this->pdo->prepare($sql); 
     $this->query->execute(); 

    } 

} 

$user = new users; 
$user_id = 10; 
$comment_text = 'hello everyone'; 
$time = date("y/m/d - h:i:s"); 
$user->insertComment($user_id, $comment_text, $time); 
+0

In Verbindung haben Sie PDO in einer $ pdo-Eigenschaft. Bei Benutzern haben Sie eine Verbindung in einer $ pdo-Eigenschaft. Um von Benutzern auf PDO zuzugreifen, müssten Sie dann '$ this-> pdo-> pdo' verwenden. Dies ist, wo Benennung für Sie verwirrend wird. – Devon

+0

es funktioniert nicht können Sie mehr erklären, um die ganze Idee zu bekommen –

+1

mein Tipp ist es, Ihre Klasse "connect" loszuwerden. PDO ist bereits eine voll ausgestattete db-Klasse. keine Notwendigkeit, das in eine benutzerdefinierte zu wickeln! – Jeff

Antwort

0

In connect, Sie haben PDO in einem $pdo Eigenschaft. Bei Benutzern haben Sie eine Verbindung in einer $pdo Eigenschaft. Um von Benutzern auf PDO zuzugreifen, müssten Sie dann $this->pdo->pdo verwenden. Dies ist, wo Benennung für Sie verwirrend wird.

Wenn Sie nur diese Klasse verwenden, um eine PDO-Instanz (Singleton-Muster) zu verwalten, gibt es keinen Grund, magische Funktionen zu verwenden. Geben Sie das PDO-Objekt in getInstance() anstelle einer Instanz von connect zurück:

 /** 
     * @return PDO 
     */ 
     public static function getInstance() { 
      if(!isset(self::$instance)) { 
       self::$instance = new connect(); 
      } 
      return self::$instance->pdo; 
     } 
0

Sie würden wollen $this->pdo->pdo->prepare($sql);, die derzeit nicht zugänglich, weil $pdo derzeit privat connect in Ihrer Klasse.

$this->pdo bezieht sich auf Ihre erste (was Datenbankklasse connect zu sein scheint), wo Sie dann $this->pdo wieder sein die tatsächliche PDO-Datenbank-Klasse (Fügen Sie diese auf Ihre connect Klasse) zu erreichen Sie versuchen zuweisen.

Sie konnten die magische Methode verwenden __call diese Anforderungen an die Eltern PDO-Klasse zu übermitteln:

public function __call($method, $args) 
{ 
    if (method_exists($this->pdo, $method)) 
    { 
     return call_user_func_array(array($this-pdo, $method), $args); 
    } 
} 
0

Sie müssen die Kapselung in der objektorientierten Programmierung verstehen. Wenn Sie eine Variable als privat deklarieren, kann sie nicht außerhalb der Klasse aufgelöst werden. Lassen Sie mich sagen Sie

deklarieren
private $pdo 

Sie nicht diese Variable in Benutzerklasse die einzige visiable in Verbindungsklasse sehen. In Ihrer Benutzerklasse haben Sie $ pdo zugewiesen, um die Instanz zu verbinden (Singleton-Instanz), aber wenn Sie $ pdo in der Benutzerklasse verwenden, versuchen Sie, auf natives pdo zuzugreifen, was nicht der Fall ist. Verwenden Sie daher Getter/Setter für private Variablen. In Ihrer Verbindungsklasse:

function getPDO(){ 

    return $this->pdo; 
    } 
    // You dont need setter because you may will not use another driver in lifecyle 

Also, wenn Sie wollen Datenbanktreiber rufen Sie diese Verknüpfung verwenden, ohne Zweifel

connect::getInstance()->getPDO(); 

Bitte zögern Sie nicht länger etwas in den Kommentaren zu fragen. Hoffnung hilft !!!