2016-07-30 4 views
-1

私はそれが示してクエリを実行しようとするたびに:コール接続::準備()

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

//この他のページのrequire_once「connect.php」で。 $pdoは、あなたのクラスconnectでプライベートなので

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

接続時に、$ pdoプロパティにPDOがあります。ユーザーは、$ pdoプロパティーで接続しています。ユーザからPDOにアクセスするには、 '$ this-> pdo-> pdo'を使う必要があります。これはネーミングがあなたのために混乱するところです。 – Devon

+0

それは仕事をdosen'tあなたは全体のアイデアを得るために多くを説明することができます –

+1

私のヒントはあなたのクラス '接続'を取り除くことです。 PDOは既に完全装備のDBクラスです。それをカスタムのもので包む必要はありません! – Jeff

答えて

0

を、あなたは$pdoプロパティにPDOを持っています。ユーザーの場合、$pdoプロパティで接続しています。ユーザーからPDOにアクセスするには、$this->pdo->pdoを使用する必要があります。これはネーミングがあなたのために混乱するところです。

PDOの1つのインスタンス(シングルトンパターン)を維持するためにこのクラスのみを使用している場合、ここではマジック関数を使用する必要はありません。connectのインスタンスの代わりにgetInstance()

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

あなたは現在アクセスできません$this->pdo->pdo->prepare($sql);を、したいと思います。

$this->pdo

あなたは、あなたが(あなたの connectクラスにこれを追加)到達しようとしている実際のPDOデータベースクラスであることを再び $this->pdoを代入している、(データベースクラス connectと思われるもの)あなたの最初を指します。

あなたは親PDOクラスにこれらの要求を転送するために魔法のメソッド__callを使用することができます。接続には

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

オブジェクト指向プログラミングでカプセル化を理解する必要があります。変数をprivateとして宣言すると、クラスの外部では解決できません。

private $pdo 

ユーザークラスの変数が接続クラスでしか表示できないことはわかりません。 あなたのユーザクラスでは、インスタンス(シングルトンインスタンス)を接続するために$ pdoを使用していますが、ユーザクラスで$ pdoを使用すると、ネイティブpdoにアクセスしようとします。 プライベート変数にはgetter/setterを使用してください。

function getPDO(){ 

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

あなたは間違い

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

ずにこのショートカットを使用するデータベースドライバを呼び出したいときにコメントで何かを依頼するhesistateないでください:あなたの接続クラスで。希望は助けます!

関連する問題