2010-12-17 7 views
1

私は、クエリーがうまくいかない場合、エラーロギングのためのPDOおよびPDOStatementクラスへの単純な拡張があります。ここに私のコードに簡略化される:

明らか
class MyPDO extends PDO 
{ 
    public function __construct($db) 
    { 
     try 
     { 
      parent::__construct('mysql:host=localhost;dbname=' . $db, $user, $pass); 
      $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT); 
      $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('MyPDOStatement', array($this))); 
     } 
     catch(PDOException $e) 
     { 
      $this->error(array($e->getCode(), $e->getMessage(), '08006')); 
     } 
    } 

    function query($query) 
    { 
     $stmt = parent::query($query); 
     if ($stmt !== false) 
      return $stmt; 
     else 
     { 
      $this->error($this->errorInfo(), $query); 
      return false; 
     } 
    } 

    function error($info, $query = false) 
    { 
     // log error here 
    } 
} 

、私は準備()とexec()メソッド、および同様の文クラスのexecute()メソッドを上書きしています。これらの(または上記のようなquery()に)エラーがある場合、それらはすべて正常に動作します。問題はPDOがデータベースへの接続に失敗したときに、「PHP致命的なエラー:キャッチに含まれる行の非オブジェクト上のメンバ関数error()コール」エラーが発生することです。

私はキャッチのMyPDO :: error()で置き換えようとしましたが、エラーで何もしないようです。私は問題が何であるかに困惑しています。

+0

奇妙に見えます。興味深いことに、 'parent :: __ construct'が何をしているのか分かりません。 –

+0

@Pekka PDOインスタンスを作成しようとしていますが、おそらく$ userと$ passが存在しないので恐ろしく失敗します。 – Gordon

+0

@Gordon true :)しかし、私はこれを引き起こすために '$ this'に何をするのかというよりむしろそうでした。あなたは説明がありますか?私は1つ考えることができません。 '$ this 'はコンストラクタで設定解除できますか? –

答えて

4

PDOのバグのようです。次のコードは、 "NULL"を出力し、 "object(MyPDO)"を期待どおりに出力しません。

class MyPDO extends PDO 
{ 
    public function __construct() { 
     try { 
      parent::__construct(111); 
     } catch(Exception $e) { 
      var_dump($this); 
     } 
    } 
} 

$p = new MyPDO; 

オブジェクトが完全に初期化される前に、PDO :: constructが例外をスローするようです。

彼らはすでに固定されていると言います(http://bugs.php.net/bug.php?id=52053)ので、最新のバージョンにアップグレードしてください。

+0

これは、前回のコメント作成者があなたの答え(後でそれを削除した人)に対して示唆したように、うまくいくと思っていただけです。私は現在PHP 5.3.3を使用していますが、このバグは5.3.4のchangelogには記載されていません。たぶん、彼らはまだその修正を公開リリースに入れていないかもしれません。とにかく、答えをありがとう、私はクラスに含まれていない関数を使用して問題を回避します。 – Mike

関連する問題