PHPのPDOで、実行前、または実行後のSQL文を取得することは可能でしょうか?


<?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使いたい…。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/11/18 15:00:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント50pt
$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

他1件のコメントを見る
id:Cherenkov

bindParamした分は後から付け足すしかないようです
http://stackoverflow.com/questions/530627/getting-a-pdo-query-string-with-bound-parameters-without-executing-it

2011/11/11 20:39:15
id:munyaX

情報ありがとうございます。
なるほど、プレースホルダはムリですかー。複雑なSQLだと単純な文字列置換ではなく、パースする局面とか出てきそうで、それを考えると少し億劫ですね(^^;

参考にさせていただきます!

2011/11/12 00:14:51
id:TransFreeBSD No.2

回答回数668ベストアンサー獲得回数268

ポイント50pt

サーバ側でログを取るのはどうでしょう?
プレースホルダ部がどう記録されるのかは分かりませんが。
http://www.howtogeek.com/howto/database/monitor-all-sql-queries-in-mysql/

id:munyaX

MySQLのログにプレースホルダが反映された形で記録できるところまでは確認しているのですが、ただ実行されたSQLが全部記録されてしまうため、何かしら制御(フィルタリング)がしたい感じです。

PerlとかPHPで後から集計しても良いのですが、もう少し楽な方法があれば助かるのですが(^^;

2011/11/12 00:17:12
id:TransFreeBSD

パッと思いつくところだと、名前付きパイプを使ってログを受け取り、普段は記録しないけど、何か(シグナル、ファイル、ソケットetc...)で記録開始停止を指示できる様なスクリプトを書いてPHPから制御する、とかだけど、楽ではないですね(^^;

2011/11/12 21:02:31

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません