Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP PDO-无法序列化或取消序列化PDO实例_Php_Serialization_Pdo_Shopping Cart - Fatal编程技术网

PHP PDO-无法序列化或取消序列化PDO实例

PHP PDO-无法序列化或取消序列化PDO实例,php,serialization,pdo,shopping-cart,Php,Serialization,Pdo,Shopping Cart,我需要从控制器将PDO连接传递到购物车类 function __construct($connection) { $this->cart = new cart($connection); } 但我认为问题在于serialize() 我得到这个错误 致命错误:未捕获异常“PDOException”,消息为“You” 无法序列化或取消序列化中的PDO实例 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u

我需要从
控制器
将PDO连接传递到
购物车

function __construct($connection) 
{
    $this->cart = new cart($connection);
}
但我认为问题在于
serialize()

我得到这个错误

致命错误:未捕获异常“PDOException”,消息为“You” 无法序列化或取消序列化中的PDO实例 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php:89 堆栈跟踪:#0[内部函数]:PDO->#U sleep()#1 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php(89): 序列化(对象(购物车))#2 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u factory.php(75): 基本扩展购物车->呈现页面()#3 C:\wamp\www\store_2012_MVC\index.php(69):factory->render() 投入 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php 在线89

我怎样才能解决这个问题

或者我可以用别的东西代替
serialize()

编辑:

我用
\uuu sleep
\uuu wakeup
魔术方法尝试了一下,但仍然得到了同样的错误

class database_pdo
{
    # database handler
    protected $connection = null;

    # make a connection
    public function __construct($dsn,$username,$password)
    {
        try 
        {

            $this->connection = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

    # don't forget to add getter method to get $this->connection, it's just a good practice.
    public function get_connection()
    {
        return $this->connection;
    }

    public function __sleep()
    {
        return array('connection');
    }

    public function __wakeup()
    {
        $this->connection;
    }

}

看看“睡眠和唤醒”的神奇方法。


它们允许您指定哪些属性被序列化,哪些属性被忽略。问题是,您需要定期传入PDO对象的实例。

PDO对象包含到数据库的活动链接(可能有事务启动或db会话设置和变量)

无法序列化PDO对象,因为上面的内容将丢失并且无法自动重新建立


您应该重新设计类,以便使用单独的类(专用于保存db连接)静态访问当前数据库链接,而不是将引用保存在成员变量中(我相信在执行new cart($connection)时会发生这种情况)。

谢谢您的回答。我刚刚试过,但仍然得到相同的错误,请你看看我的编辑上面。谢谢,你得把它倒过来。使用_sleep,返回要序列化的属性数组。关键是能够排除不可序列化的属性。你的连接属性。我之所以说这可能不是最好的解决方案,是因为无论何时从$\u会话全局访问购物车,都必须重置连接属性。类似于$购物车=$\u会话['cart']$cart->set_connection($db)自~PHP5.3.0以来,似乎_sleep和_wakeup已被标记为PDO语句和PDO的final,因此不可能有更多的技巧:)旁注-如果您的类继承自PDO,并且您克隆了该对象,您也将收到此错误。在我的例子中,我在克隆之前将$obj->pdo设置为null。
class database_pdo
{
    # database handler
    protected $connection = null;

    # make a connection
    public function __construct($dsn,$username,$password)
    {
        try 
        {

            $this->connection = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

        }
        catch (PDOException $e) 
        {
            # call the get_error function
            $this->get_error($e);
        }
    }

    # don't forget to add getter method to get $this->connection, it's just a good practice.
    public function get_connection()
    {
        return $this->connection;
    }

    public function __sleep()
    {
        return array('connection');
    }

    public function __wakeup()
    {
        $this->connection;
    }

}