人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: munyaX
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Cherenkov
●50ポイント
$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


Cherenkovさんのコメント
bindParamしたものが取れないかも…

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

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

2 ● TransFreeBSD
●50ポイント

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


munyaXさんのコメント
MySQLのログにプレースホルダが反映された形で記録できるところまでは確認しているのですが、ただ実行されたSQLが全部記録されてしまうため、何かしら制御(フィルタリング)がしたい感じです。 PerlとかPHPで後から集計しても良いのですが、もう少し楽な方法があれば助かるのですが(^^;

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

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ