12

重複の可能性:
PDO 準備済みステートメントから完全なクエリを取得 (またはシミュレート)

クエリが 0 行を返す理由がわかりません。非常に動的な検索機能が実装されており、多くの if/loop ステートメントなどが実装されています。そのため、デバッグするために、送信されている文字列を正確に確認したいと思います。サーバーに。PHPでこれを行う方法はありますか?

サーバーに「最後のクエリは何ですか」と尋ねるか、PDOに「送信したものを表示してください」と伝える方法はありますか?

str_replaceの代わりに値を手動で入力するためにを使用している回答が 1 つ見られまし:fieldValueたが、これは構文の問題である可能性が高く (または、間違ったループを通過しているなど)、この方法では役に立ちません。

それが違いを生む場合を使用bindValue(":fieldValue", $value);します。

編集

if ($var="true") { ...あるべきだったのは単純だったことがわかりましたif ($var=="true") { ...。その意味で、PHPはJavaと同じではないと思いますか?いずれにせよ、問題は依然として残っています (私はこれによく出くわします)。echo "You are Here";技術的には有効ですが正しくないため、このエラーを見つけるために一連のエラーを使用する必要がありました。最終的な SQL ステートメントがあれば、「ああ、私のコードは を追加しましたwhere column = true。間違った IF を通過したに違いありません...」と表示されたはずです。

4

1 に答える 1

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);
于 2012-06-20T15:22:38.747 に答える