10

我有两个问题:

  • 要从 PDO 准备语句中受益,我应该首先使用 PDO 对象准备语句:

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

然后将这个 $statement 存储在 $_SESSION 中并重用这个语句,或者下次我想要执行相同的查询(使用不同的绑定值)时是否应该再次执行相同的操作(PDO::prepare)?

  • 在创建 PDO 对象时使用 PDO::ATTR_PERSISTENT 时将 PDO 对象存储在 $_SESSION 中是否有用?
4

2 回答 2

9

您不应将 PDO 对象存储在会话中。

使用 PDO 对象的最佳(也是唯一正确)方法是在对服务器的每个请求时创建它们。

准备好的查询的好处有两种方式:

  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 回答