1

私は次のコードを持っています:

$clicks = $statement->prepare($query);
$offers->bindValue(1, $id, PDO::PARAM_INT);
$clicks->execute();
$results = $clicks->fetchAll();
  • クエリは正常に機能します
  • バインディングは正常に機能します

実際に何が私を不思議に思うのか、なぜ私は最初にfetchAll()を呼び出すことができるクエリをexecute()しなければならないのか。execute()はtrue / falseのみを返し、execute()を呼び出さないと、fetchAll()は何も返さないため、この解決策/仮定に到達しました。これはそれを行う通常の方法ですか?

私はずっと前にPDOを使っていたので、それを適切に処理する方法をよく覚えていません。

どうもありがとうございます

(私はPHP5.3を使用しています。上記で使用したコードはPDO / PDOStatementです)

4

3 に答える 3

4

まあ、SELECT * FROM myTableこれは単なるテキストであり、最初にサーバーに送信する必要があります。サーバーはそれを解析する前に、などを実行しますfetchAll()fetchAll自動的に呼び出されない理由execute()fetchAll、2回呼び出すことができ、1回だけ実行する必要がある場合は、クエリを2回実行したくないからです:)

これは、パラメーターのバインドなどにも関連しています。パラメーターは変更される可能性がありますが、元のパラメーター値に対してフェッチ関数を使用することもできます。

これは設計上の問題であり、PDOを使用したプログラミングがはるかに簡単になります。あと1行のコードが必要です:)

おそらくラッパーを作成fetchAll()して実行とフェッチの両方を実行させることもできますが、間違いなく問題が発生します。

編集:別の理由は、execute()実際には、パラメーターをバインドできるようにするパラメーターのオプションの配列を使用することです。呼び出し$stmt -> execute(array($id));をスキップすることができます。bindValue

于 2012-04-23T10:31:16.933 に答える
1

PDOprepare()プリペアドステートメントを使用するため、そうです。結果を得るには、プリペアドステートメントを準備してから実行する必要があります。query()ステートメントを再利用する必要がない場合に使用できます。

于 2012-04-23T10:29:32.167 に答える
1

変数がバインドされるとすぐにSQLが自動的に実行された場合、複数の変数をバインドすることはできません。したがって、ステートメントを明示的に実行して、バインドが完了したときに通知する必要があります。

于 2012-04-23T10:30:48.707 に答える