2012-06-20 9 views
12

可能性の重複:
Retrieve (or simulate) full query from PDO prepared statementPDOのデバッグ - バインド後のクエリの表示

私のクエリは...それはいくつかの非常にダイナミックな検索機能を実装し、もし/ループたくさんの0行を返して、なぜ私が把握することはできませんステートメント等のためにそれをデバッグするために、私は正確にどの文字列がサーバーに送られているのを見たいと思います。 PHPでこれを行う方法はありますか?

サーバに「最後のクエリは何か」と尋ねる方法や、PDOに「送信したものを表示する」と言う方法がありますか?

の代わりにstr_replaceを手動で入力すると1つの応答が表示されましたが、この方法では役に立たない構文の問題(または不正なループなど)が考えられます。

bindValue(":fieldValue", $value);を使用すると違いがあります。

EDIT

は、それがif ($var=="true") { ...されている必要があり、単純なif ($var="true") { ...だったが判明します。 PHP私はその意味でJavaと同じではないと思いますか?いずれにせよ、問題は依然として立っています(私はこれを頻繁に実行する)。私はこのエラーを見つけるために一連のecho "You are Here";を使用しなければなりませんでした。私は最終的なSQLステートメントを持っていた場合、私は "ああ、私のコードはwhere column = trueを追加した、間違ったIFを通過している必要があります..."見たことができます。

+1

準備/バインドがエミュレートされていない場合は、あなたが話しているのクエリはどこにも存在しません。ステートメントとバインドは、データベースに不可欠です。しかし、あなたの開発サーバ上で 'query_log'を有効にすることは、何が行われたのかを明らかにするでしょう。 – Wrikken

+0

それは事です。私は何を試すべきか分からない。私は通常 '$ sql'が私のステートメントですが、PDO(これは私が新しくなったもの)を使って簡単な' echo $ sql'を使ってこれを行います。 'SELECT column FROM table WHERE column =:fieldValue' doesn whereステートメントがどこかで間違って終わった場合、私を助けません。 – StuckAtWork

+2

可能な複製[PDO準備文からの完全なクエリの取得(またはシミュレート)](http://stackoverflow.com/questions/3754530/retrieve-or-simulate-full-query-from-pdo-prepared-statement)とhttp ://stackoverflow.com/questions/530627/getting-a-pdo-query-string-with-bound-parameters-without-executing-itおよびhttp:// stackoverflowを参照してください。com/questions/1786322/in-php-with-pdo-how-to-final-sql-parametified-query –

答えて

0

これは、SQLデバッグに関する最も一般的な神話です。 "エラーが発生したかどうかを知るためには、準備後のクエリを参照する必要があります"。事実は、あなたはではありません、そして、私はあなたにその理由を教えます。

クエリが準備されると、プレースホルダは有効な文字列/整数とみなされます。あなたはそれに気をつけません。

また、PDOを正しく設定した場合は、エラーが発生した場所の完全なバックトレースとともに、詳細なPDOExceptionが表示されます。さらに、MySQLからのエラー文字列が得られますエラーを見つけるのは非常に簡単です。エミュレートされたPDOの例外を有効または無効にする

は準備:

$pdo = new PDO("mysql:host=localhost;dbname=database_name", "user", "password"); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
+1

エラー処理が正しく行われました。問題はエラーがないことです。私は実際に何が送られているのかを知る必要があったので、自分のコードのどこに情報が得られたのかを知ることができました。最終的な文字列を調べることができないと、何が何をしているのかを知ることができませんでした。 「0行を返す」、「エラーを投げる」ではありません。 – StuckAtWork

+0

@ StuckAtWork:グローバルスペースのようなものを使用していない場合は、何が問題になるのかを問う必要はありません。 –

+1

回答を編集で参照してください。問題は明らかなものではありませんでしたが、私はそれが正確に拘束力のあるものであるかを確認できました。いくつかの条件に応じて、 ':fieldValue'sとは異なる何かをバインドします。私は手動で行って、 ':fieldValue'がどのようにバインドされていたのかを確認するために、どの行が実行されているかを確認しなければなりませんでした。 – StuckAtWork

関連する問題