2011-07-26 9 views
0

私はSQLステートメントとバインディングパラメータを準備しています。何か問題が生じた場合は、catchブロックでそれらを捕まえます。しかし、私はどのクエリを処理したかを知りたい。 。ここに来て、php PDOで処理されたクエリを見る方法は? !

class PDOTester extends PDO { 
public function __construct($dsn, $username = null, $password = null, $driver_options = array()) { 
    parent::__construct($dsn, $username, $password, $driver_options); 
    $this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array('PDOStatementTester', array($this))); 
} 
} 
class PDOStatementTester extends PDOStatement { 
protected $connection; 

protected function __construct(PDO $connection) 
{ 
    $this->connection = $connection; 
} 

public function execute() { 
    try { 
     parent::execute(); 
    } catch (PDOException $e) { 
     $e->errorInfo[3] = $this->queryString; 
     echo '<pre>'; 
     var_dump($this); 
     var_dump($this->connection); 
     echo '</pre>'; 
     throw $e; 
    } 
} 
} 

しかし:だから私は、インターネット上でそれを見つけたPDOクラスを(拡張ATTR_STATEMENT_CLASSが、本当にここで、正確にわからないので、これは私がやっているか拡張子のコードがあります問題は、私はそれに値をバインドする名前付きパラメータを使用しますが、私は、SQLクエリを見たとき、私は名前付きパラメータではなく値を参照してください

を例えば、私は好きで、それを使用します!

try { 
$sql = "INSERT INTO table (column1, column2) VALUES (:column1, :column2)"; 
$stmt = $db->preapre($sql); 
$stmt->bindParam(':column1', $column1, PDO::PARAM_STR); 
$stmt->bindParam(':column2', $column2, PDO::PARAM_INT); 
$stmt->execute(); 
} catch (PDOException $e) { 
echo $e->errorInfo[3]; 
} 

しかし、私は実際の変数の代わりにcolumn1、:column2という値を参照してください! 誰かが私を助けてくれますか?(たとえば、私が使っている拡張機能の改良版を提供していますか?)

PHPバージョン5.2.17、MySQLバージョン5.0.92

答えて

0

を使用するときにあなたの最良のオプションは、MySQLのを回すことであろう実際のクエリを参照する方法はありません一般的なログオプション。 実行MySQLの端末(またはMySQLを制御するために使用する任意の他の好適なプログラム/アプリ)で、次の

SET GLOBAL general_log = ON; 
SET GLOBAL general_log_file = 'path_to_file.log'; 

はファイルを検査し、クエリを実行します。

+0

素晴らしい! Thnx、それはとても便利でした! – Orhan

+0

クエリに構文エラーまたは列/フィールドがない場合(PDOExceptionがスローされる可能性が高い理由の1つです)、まだログに記録されますか? (部分的に私の好奇心のため、一部は一般的な説明のため) – Zimzat

+0

実際にMySQLに到達するものはすべてログに記録されます。このようなエラー実装があると仮定して、PDOExceptionをスローする存在しない関数を呼び出すと、その関数はログに記録されません。それは、トランザクションや不正なクエリなどで失敗したクエリをログに記録します。基本的にはMySQLデーモンに到達します。 –

0

実際には、彼らがやったことをするためにPDOクラスを拡張する必要はありませんでした。単純に新しいインスタンスを作成し、その属性を作成した後ではなく、その属性を追加(または削除)します。

つまり、ステートメントに関するデバッグ情報を出力する方法が組み込まれており、それはPDOStatement->debugDumpParamsを使用しています。これでコンパイルされたバージョンは表示されません(これはそれをサポートしているデータベースではデータベース側で実行されています)が、クエリとそのバインドされたパラメータの両方を簡単に見ることができます。

ライブシステムではこれを有効にしないでください。それはあなたのウェブサイトの攻撃者に、あなたのシステムがどのように設定されているか、そして彼らが何をやり遂げることができるか(および破壊するか、そうでなければ破壊する)の大きな手がかりを与えるかもしれません。

+0

機能のThnx!しかし、それでもパラメータの値は出力されません。 – Orhan

+0

...ハァッ。そうではありません。私はそのページの例を誤解しました。私はこれがZendのDbアダプタがこれらすべての側面をカプセル化している理由だと思います。 – Zimzat

関連する問題