2011-12-11 57 views
2

可能重复里面的数据库连接:
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中工作会议,是什么让定义的类作为一个正常的变量和内部$_SESSION变量之间的区别!?

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

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

您可以使用var_dump($ _ SESSION ['DBCONNECTION'])来查看会话包含的内容。 – zzarbi

+2

除了技术上的困难,你甚至不应该那样做。它不属于一个会话。为什么每个用户(= session)都有自己的数据库连接句柄? – mario

+0

它避开了我为什么要在会话中存储数据库连接。 – Till

回答

2

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

6

不能存储$_SESSION内的ressource手柄。请参阅PHP.net

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

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

0

好了,几件事情上

  1. 在会话中存储的连接评论是非常糟糕的主意

  2. 保存session里面的资源无论如何都不会工作,据我所知

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

0

当你序列化你的MySQL类,那么你可以很容易地将对象设置为$_SESSION.