<?php
//接続
$dbh = new PDO("mysql:host=localhost;dbname=database;","foobar","20111111");
//SQL準備
$sth = $dbh->prepare("select * from hoge where id=?");
$sth->bindParam(1, 12345, PDO::PARAM_INT);
//--------------------------
// ここのあたりで取得したい
//--------------------------
//実行
$sth->execute();
//--------------------------
// もしくはここ
//--------------------------
?>
プレースホルダーが反映された形のSQLを実行前後で記録したいと考えているのですが、他に何か良いアイデアやライブラリがあれば教えてください。
上記の例だと、以下の文字列を取得したいという意図になります。
select * from hoge where id=12345
#どうでも良いですが質問文ではてな記法が使えないの直してほしいですね。
#スーパーpre使いたい…。
$sth = $dbh->prepare("select * from hoge where id=?"); $paramId = 12345; $sth->bindParam(1, $paramId, PDO::PARAM_INT); echo preg_replace('/id=\?$/', 'id='.$paramId, $sth->queryString);
参考:
php - Getting a PDO query string with bound parameters without executing it - Stack Overflow
サーバ側でログを取るのはどうでしょう?
プレースホルダ部がどう記録されるのかは分かりませんが。
http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/
MySQLのログにプレースホルダが反映された形で記録できるところまでは確認しているのですが、ただ実行されたSQLが全部記録されてしまうため、何かしら制御(フィルタリング)がしたい感じです。
PerlとかPHPで後から集計しても良いのですが、もう少し楽な方法があれば助かるのですが(^^;
パッと思いつくところだと、名前付きパイプを使ってログを受け取り、普段は記録しないけど、何か(シグナル、ファイル、ソケットetc...)で記録開始停止を指示できる様なスクリプトを書いてPHPから制御する、とかだけど、楽ではないですね(^^;
bindParamした分は後から付け足すしかないようです
2011/11/11 20:39:15http://stackoverflow.com/questions/530627/getting-a-pdo-query-string-with-bound-parameters-without-executing-it
情報ありがとうございます。
2011/11/12 00:14:51なるほど、プレースホルダはムリですかー。複雑なSQLだと単純な文字列置換ではなく、パースする局面とか出てきそうで、それを考えると少し億劫ですね(^^;
参考にさせていただきます!