2016-12-23 14 views
-1

接続クラスの外部でクエリを実行しようとすると、次のエラーが発生します。クラス外のPDOを使用する未定義のメソッド

Fatal error: Call to undefined method Core\Database::query() in...

以下のファイルがあります。

database.phpで

namespace Core; 

use \PDO; 

class Database 
{ 
    private $pdo; 
    private static $instance; 

    private function __construct() 
    { 
     try { 
      $this->pdo = new PDO("mysql:host=localhost;dbname=db;", "root", "pw"); 
      $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     } catch (\PDOException $e) { 
      echo $e->getMessage(); 
     } 
    } 

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

Auth.phpあなたの助けを事前に

namespace Auth; 

use Core\Database; 

class Auth 
{ 
    protected $dbh; 

    public function __construct() 
    { 
     $this->dbh = Database::getInstance(); 
     $query = $this->dbh->query("SELECT * FROM table"); 
    } 
} 

感謝。

+0

エラーのように、データベースクラスにはクエリメソッドがありません。 getInstance()は、PDOではなくDatabaseクラスのインスタンスを返します。 – Devon

+0

@Devon、ok:Auth.phpで '$ this-> dbh-> query'を' $ this-> dbh-> pdo-> query'に変更しましたが、それ以外の方法はありますか?ちょっと混乱しているようです。 – lingo

+0

また、インスタンス変数 '$ pdo' * public *を作成してください。そうしないと、特にAuthから' - > query(...) 'を呼び出すときにクラスの外部にアクセスすることができなくなります。クラス。 –

答えて

0

データベースクラスのプロパティを設定し、静的な値を返します。おそらく、代わりにこれをやりたいと思うかもしれません:愚かなラッパークラスを作成するのではなく、これを個人的に行っています。

そうしないと、代わりに静的変数を設定する必要があります:

self::$instance = new PDO("mysql:host=localhost;dbname=db;", "root", "pw"); 
0

あなたがちょうどSingletonパターンを使用して起動しようとしてDatabaseクラスのインスタンスを作成してあるAuthクラスで何をやりましたかそのクラスに定義されていないDatabaseインスタンスのqueryメソッド。 $this->dbh->query()のようにアクセスしたい場合は、Databaseクラスのインスタンスを構築し、PDOインスタンスを同時に返す必要があります。このように:

public static function getInstance() { 
    if (!isset(self::$instance)) 
     self::$instance = new Database(); 
    return self::$instance->pdo; 
} 

ここで変更した内容はreturn self::$instance->pdoです。 getInstanceが初めて呼び出された場合は、Databaseクラスがインスタンス化された後、PDOというオブジェクトが返されます。それ以外の場合は、作成されたPDOインスタンスが返されます。 Authクラスで$this->dbh->query()を実行できるようになりました。あなたはgetInstanceのようなstatic方法以外Databaseクラスの他のメソッドを定義するつもりはない場合

注意、あなただけのこの操作を行う必要があります。 getInstanceの結果では、PDOのプロパティとメソッドにしかアクセスできません。そのための解決方法は、メソッドをDatabaseに定義して、PDOインスタンスを別々に返すことです。

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

public function getPDO() { 
    return $this->pdo; 
} 

あなたがそれを完了したら、あなたのようAuthクラスでPDOにアクセスすることができます。

public function __construct() 
{ 
    $this->dbh = Database::getInstance()->getPDO(); 
    $query = $this->dbh->query("SELECT * FROM table"); 
} 

はそれが役に立てば幸い!

関連する問題