【php】PDOを拡張してログをとれるようにする
問題
PDOを使っていますが、実行したSQLのログを取りたいです。

答え
PDOを継承するとこんな感じで可能です。
<?php
class db extends PDO
{
public $logs = array();
function query($q)
{
$this->log($q);
return parent::query($q);
}
function exec($q)
{
$this->log($q);
return parent::exec($q);
}
function log($sql)
{
$this->logs[] = $sql;
}
}
PDO::query() や PDO::exec() をオーバーライドして、ログ保存の処理を追加している。
上の例のように、ひとまず配列にSQLをため込んでもよいし、file_put_contents()などで、随時ファイルに保存してもよいでしょう。
ログの内容に、日時や実行結果(成功、失敗、エラー内容)などを残すこともできる。
プリペアドステートメントは、PDO::prepared()やPDO::execute()に渡された内容を取得することはできても、最終的に実行されたSQLは取得する方法がなさそう。
プリペアドステートメントのログも残すなら、PDO::prepared()やPDO::execute()が呼ばれた時の引数を保存しておくぐらいまでが簡単。