【问题标题】:Can a PDO object be stored in session?PDO 对象可以存储在会话中吗?
【发布时间】:2012-09-29 10:41:14
【问题描述】:

我有两个问题:

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

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

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

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

【问题讨论】:

  • PS:如果加-1,至少花点时间说一下原因,谢谢...
  • 这个“重复”只回答了我的两个问题之一,对不起。
  • 绝对没有理由不赞成这个问题。
  • 为什么要将它们存储在会话中?如果您一直需要它们,只需在应用程序的引导程序/索引中创建对象...

标签: php session pdo


【解决方案1】:

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

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

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

  1. 多次执行同一查询时,速度优势
  2. 存在参数绑定的可能性,以防止 SQL 注入。

在会话中存储 PDO 资源时,随着来自不同客户端的请求进入,将建立与数据库的开放连接。PDO 会连接池,试图保持与数据库的连接。数据库达到最低,但仍然有一些连接打开以提高速度。通过将 pdo 连接存储在会话中,该机制被终止。而且性能会受到影响。

【讨论】:

  • JvdBerg,你应该解释一下为什么这也是不好的做法!我也很好奇。
  • 谢谢。你说:“当多次执行相同的查询时,有速度优势”。在单个 HTTP 请求或多个 HTTP 请求期间是这样吗?
  • 只有在同一个 http 请求中才是正确的。考虑更新多个用户帐户,例如使用不同的数据。数据进入绑定,查询准备一次。
  • +1。一般来说,包含resources 的类不应该存储在会话中,因为它们不是可序列化的。更多关于 here.
  • @halfer:PDO 不是资源。它是一个对象,但它包含一个资源。
【解决方案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

至于为什么-已经回答here

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2017-08-25
    • 2015-05-28
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多