【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()が呼ばれた時の引数を保存しておくぐらいまでが簡単。
コメント