🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

11214閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

1クリップ

投稿2019/10/31 00:38

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

PHP

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

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

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

nikuatsu👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/10/31 01:04

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

退会済みユーザー

2019/10/31 01:21

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

2019/10/31 01:24

「最終的に発行するSQL文を作成するのはPDOなので」という前提が誤りという場合もあります。 プリペアドステートメントのエミュレーションをかけていない場合、最終形を作るのはデータベースエンジンの中で、PDOはプレースホルダのままDBサーバに投げています。
guest

回答4

0

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

投稿2019/10/31 01:01

yambejp

総合スコア116688

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/31 01:33

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

0

ベストアンサー

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

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

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

投稿2019/10/31 01:16

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/31 01:29

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

退会済みユーザー

2019/10/31 01:54

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

0

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

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

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

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

投稿2019/10/31 01:50

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/31 02:55

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

0

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

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

投稿2019/10/31 00:41

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/31 00:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問