2011-01-19 6 views
4

私はPDOをテスト目的で初めて使用しています。 しかし、奇妙なエラーが発生し、それを検索して、それは変わったようです。PDOとの接続に関する問題

Warning: PDO::prepare() [pdo.prepare]: SQLSTATE[00000]: No error: PDO constructor was not called in myfile.php on line 39 

としてライン39を考える:それは私に次のエラーが表示さ

$db = new db(); 
$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1)); 
echo $row['value']; 

は、ここに私のデータベースのテスト次にクラス

class db extends PDO 
{ 
    # Our instance. 
    private static $db = NULL; 

    # Calling the connector. 
    public static function connect() 
    { 
     if (self::$db === NULL) 
     { 
      $class = __CLASS__; 
      self::$db = new $class(); 
     } 
     return self::$db; 
    } 

    # Connector. 
    public function __construct() 
    { 
     $dns = 'mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'); 
     self::$db = new PDO($dns, reg::get('db-username'), reg::get('db-password')); 
     reg::delete('db-password'); 
    } 

    # Quick reporting 
    public function reportError($array) 
    { 
     if ($this->db != NULL) { echo 'Myself getting horny'; } // Just for testing, i'm not getting horny because of a mysql database connection! 
    } 

} 

次のコードを実行します

$row = $db->prepare('SELECT * FROM test WHERE id = :id')->execute(array('id' => 1)); 
+0

@andreマトスを、はい、私はやりました。同じ正確なエラーが表示されます。 – Shoe

+0

なぜそこに接続メソッドがありますか? '$ db'が' self :: $ db'ではなくヌルであるかどうかチェックするのはなぜですか?なぜあなたは 'self :: $ db = new db();'をやっているのですか? –

+0

まだ問題はありませんが、テーブル/列名にプレースホルダを使用することはできません。値に評価されるものに対してのみ。 – goat

答えて

5

あなたのコードは混乱であるあなたはとても角質だから、それはおそらくです...

connect()方法 - なぜそれが?:

if ($db === NULL) 

あるべきあります:

if (self::$db === NULL) 

self::$db = new $class(); 

したがって、$class == __CLASS__ == db、あなたはself::$db = new db();を行っていますが、正しくはないようです。


PDOを使用して、表や列などの識別子を準備することはできません。

​​

は次のようになります。

$db->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1)); 

はこれを試してみてください:このように

class db extends PDO 
{ 
    private static $db = null; 

    public static function singleton() 
    { 
     if (is_null(self::$db) === true) 
     { 
      self::$db = new PDO('mysql:dbname='.reg::get('db-name').';host='.reg::get('db-host'), reg::get('db-username'), reg::get('db-password')); 
     } 

     return self::$db; 
    } 
} 

$result = db::singleton()->prepare('SELECT * FROM `test` WHERE id = :id')->execute(array('id' => 1)); 

var_dump($result); 
+0

私はそれを修正しましたが、私はまだエラーが発生します。また、どのように私はすべてのPDOメソッドを使用することができると私はdb :: singleton()/ db :: connect()を呼び出すことによって、毎回dbシングルトンのインスタンスを取得できるようになっていますか? – Shoe

+0

@Charlie Pigarelli:更新を確認してください。 –

+0

@Charlie Pigarelli:PS、あなたは本当にこれのためのクラスを必要としません、単純な関数は同じ効果があります: 'function singleton(){static $ db = null; if(is_null($ db)){$ db = new PDO(/*...*/); } $ dbを返します。 } '。 –

1

あなたは静的な '接続'コンストラクタを持っています。このコンストラクタはdbオブジェクトを(静的)にして返します。しかし、あなたも新しいdb()を自分で作成します。

準備ステートメントはself::$dbを使用しているため、静的に作成された変数を呼び出そうとします。あなたのコードがどのように動作するはずか、実際には何らかのシングルトン/スタティックフォームとオブジェクトフォームを組み合わせたものではありません。

しかし、それは、エラーメッセージとは無関係のように思わとして、私は、これはあなたの答えであれば全くわからないんだけど、私はあなたがテーブル名を渡すことができるとは思わないトラブル

+0

待って、db :: getInstance()(< - singleton?)とオブジェクトフォームを組み合わせることはできませんか? – Shoe

2

のようです結合されたパラメータとして。 :tableの場所にハードコードされたテーブル名を置くとどうなりますか?

+0

このヒントをありがとう。 – Shoe

1

あなたのシングルトンパターンはすべてが間違っていますです。あなたのコンストラクタはprivateでなければならず、$dbという静的インスタンスを使うべきです。このsingleton exampleを参照してください。

関連する問題