10

2 つの質問があります。

  • PDO プリペアド ステートメントの利点を得るには、最初に PDO オブジェクトを使用してステートメントを準備する必要があります。

    $statement = $pdo->prepare($query, $bindings);

そして、この $statement を $_SESSION に保存して、このステートメントを再利用しますか、それとも、次に同じクエリを (バインディングに異なる値を使用して) 実行したいときに、同じこと (PDO::prepare) をもう一度実行する必要がありますか?

  • PDO オブジェクトの作成時に PDO::ATTR_PERSISTENT を使用する場合、PDO オブジェクトを $_SESSION に格納すると便利ですか?
4

2 に答える 2

9

PDO オブジェクトをセッションに保存しないでください。

PDO オブジェクトを使用する最善の (そして唯一の) 方法は、サーバーへのすべての要求で PDO オブジェクトを作成することです。

準備されたクエリの利点は次の 2 とおりです。

  1. 同じクエリを複数回実行すると、速度が向上します
  2. SQL インジェクションを防ぐために、パラメータ バインドの可能性があります。

PDO リソースをセッションに保存する場合、さまざまなクライアントからのリクエストが着信すると、データベースへのオープン接続が構築されます。PDO は接続プールを実行し、データベースへの接続を最小限に抑えようとしますが、まだいくつかの接続を保持しています。スピードのためにオープン。pdo 接続をセッションに保存することにより、そのメカニズムが強制終了されます。そして、パフォーマンスが低下します。

于 2012-09-29T10:49:50.887 に答える
2

実際には、「PDOStatement インスタンスをシリアル化または非シリアル化することはできません」(実際の例外メッセージを引用)。ここに完全なメッセージがあります:

PHP Fatal error:  Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDOStatement instances' in [no active file]:0
Stack trace:
#0 [internal function]: PDOStatement->__sleep()
#1 {main}
  thrown in [no active file] on line 0

理由については、既に回答済みです

于 2016-09-19T18:34:49.070 に答える