无法将数据库连接存储在 $_SESSION 中


Cannot store database connection inside the $_SESSION

可能的重复项:
无法在 php 中的会话中传递 mysqli 连接

我正在尝试将定制的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 中的会话是如何工作的,以及将类定义为普通变量和 $_SESSION 中的变量之间的区别是什么!?

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

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

不能在 $_SESSION 中存储资源句柄。请参阅 PHP.net:

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

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

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

好吧,有几件事要评论

  1. 在会话中存储连接真的是个坏主意

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

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

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