質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

PHPのPDOで実行されたSQL文を取得することはできるでしょうか?

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 9,606

score 17

PHPのPDOで実行されたSQL文を取得することはできるでしょうか?

$pdo = new PDO (...);
$stmt = $pdo->prepare('UPDATE sample SET column1 = ?, column2 = ? WHERE id = ?');
$stmt->bindValue(1, '値1', PDO::PARAM_STR);
$stmt->bindValue(2, '値2', PDO::PARAM_STR);
$stmt->bindValue(3, 10, PDO::PARAM_INT);
$stmt->execute();
//=> UPDATE sample SET column1 = '値1', column2 = '値2' WHERE id = 10;

この実行されたSQL文を取得する$pdo->getSQL()みたいな関数はないでしょうか?
$pdo->queryStringではprepareした文字列そのもので、$pdo->debugDumpParams()ではprepareされたプレースホルダーの情報などしか得られません。そうではなく、実際に実行されたSQL文が欲しいです。(デバッグの目的です)
自前で作成する方法はこちらを参考にしましたが、できればダイレクトに取得したいです。

教えていただけるとありがたいです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2019/10/31 10:04

    「デバッグの目的」にしても、プレースホルダの文字列と中身があれば合成できますので、なぜ合成されたあとのものが必要なのか気になります。

    キャンセル

  • nori2525w

    2019/10/31 10:21

    もちろん元ネタはすべてこちらが握っているので合成することは出来ますが、最終的に発行するSQL文を作成するのはPDOなので、その結果をダイレクトに取得したいという狙いです。そうした関数があれば、
    $pdo->execute();
    log('exec SQL: ' . $pdo->getSQL());
    みたいな感じができるので。

    キャンセル

  • maisumakun

    2019/10/31 10:24

    「最終的に発行するSQL文を作成するのはPDOなので」という前提が誤りという場合もあります。

    プリペアドステートメントのエミュレーションをかけていない場合、最終形を作るのはデータベースエンジンの中で、PDOはプレースホルダのままDBサーバに投げています。

    キャンセル

回答 4

+6

考え方が逆です
文字列であらわせないからprepareで処理するわけです。
sql文を確認するならSQL側のログを確認するのが妥当です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/31 10:33

    ご回答ありがとうございます。BAに選ばせて頂いた方の仰るとおりで私の早とちりでした。お手数をおかけしました。m(_ _)m

    キャンセル

checkベストアンサー

+2

そもそも prepared statement は、サーバー側で SQL 実行時にパラメータをバインドしているわけですから、クライアントから送信される SQL はプレースホルダのままです。

ですから望まれたような出力は得られないと思います。

※MySQL のように、PDO とプレースホルダの形式が違うのであれば、加工された「MySQL が解釈できる」prepared statement を見ることはできるかと思いますが

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/31 10:29

    あ!そういうことですね。SQLはプレースホルダーのままサーバーに転送されて解析されるのでしたね。私の早とちりでした。ありがとうございます。m(_ _)m

    キャンセル

  • 2019/10/31 10:54

    エミュレーションが ON の場合、回答の前半は間違っていると思います。

    キャンセル

+1

maisumakun さんが追記/修正欄で既に指摘していますが、エミュレーションの有無で、php 側の責任範囲が変わってきます。

DB 側でクエリログを収集し最終的に実行されたクエリを確認するのが適切だと思います。

以下、目的は全然違います(その上かなり古い記事です)が、ログ収集と結果に関して参考になるかと

PDOでの数値列の扱いにはワナがいっぱい

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/31 11:55

    ご回答ありがとうございます。DB側でクエリログを収集して確認するのが一番ですね。

    キャンセル

0

「php pdo sql 確認」で検索しました。

https://www.php.net/manual/ja/pdostatement.debugdumpparams.php

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/31 09:45

    ご回答ありがとうございます。ただ、debugDumpParams()関数は実際に実行されたSQL文ではなく、プレースホルダーの数や名前や型しかわからないです。そこが難点です。。

    キャンセル

  • 2019/10/31 09:49

    こういうのもあるようです。
    https://github.com/panique/pdo-debug

    キャンセル

  • 2019/10/31 09:56

    やはり直接SQL文を取得するのは無理で、https://github.com/panique/pdo-debug/blob/master/pdo-debug.php のように自前で作るしかないのでしょうかね。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る