【问题标题】:Cannot store database connection inside the $_SESSION [duplicate]无法在 $_SESSION 中存储数据库连接 [重复]
【发布时间】:2012-01-18 01:32:06
【问题描述】:

可能重复:
Can't pass mysqli connection in session in php

我正在尝试将定制的 PHP MySql 类存储到 $_SESSION 中。访问时,PHP 会抛出错误:“脚本试图执行方法或访问不完整对象的属性......”。

include_once 'core/mysql.php';

    $conn = new mysql();
    $_SESSION['DBCONNECTION'] = new mysql();

    $result = $_SESSION['DBCONNECTION']->query_cust($sql);  // Fails!
    $result = $conn->query_cust($sql); // Works!

我只是想了解 PHP 中的 Sessions 是如何工作的,以及将类定义为普通变量和 $_SESSION 中的变量之间的区别是什么?!?

var_dump($_SESSION['DBCONNECTION']) 返回:

object(__PHP_Incomplete_Class)[1]
  public '__PHP_Incomplete_Class_Name' => string 'mysql' (length=5)
  public 'con' => int 0

【问题讨论】:

  • 您可以使用 var_dump($_SESSION['DBCONNECTION']) 查看会话包含的内容。
  • 除了技术上的困难,你甚至不应该这样做。它不属于会话。为什么每个用户(=session)都有自己的数据库连接句柄?
  • 我不明白为什么要将数据库连接存储在会话中。
  • 那么,您将如何处理数据库连接?将连接存储为全局?
  • 根本不要存储它。只需重新连接每个请求并将连接传递给需要它的每个对象,例如通过构造函数。

标签: php mysql class session web


【解决方案1】:

您不能将资源句柄存储在 $_SESSION 中。见PHP.net

某些类型的数据无法序列化,因此存储在会话中。它 包括具有循环引用的资源变量或对象(即 将对自身的引用传递给另一个对象的对象)。

由于您的对象包含连接链接,因此无法序列化。

【讨论】:

    【解决方案2】:

    存储在会话中的任何内容都需要可序列化。为什么要将连接存储在会话中?这对我来说没有意义。只需重新连接每个请求。

    【讨论】:

      【解决方案3】:

      嗯,有几件事要评论

      1. 在 Session 中存储连接真是个坏主意

      2. 在会话中存储资源无论如何都不起作用,AFAIK

      3. 关于内部机制,PHP 会序列化对象以存储在会话中,并在后续请求时反序列化。你应该看看 __sleep 和 __wakeup 魔术方法

      【讨论】:

        【解决方案4】:

        当您序列化您的 mysql 类时,您可以轻松地将对象设置为 $_SESSION.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-30
          • 2011-08-30
          • 2019-01-17
          • 2014-08-20
          • 2016-07-30
          • 2018-10-22
          相关资源
          最近更新 更多