unserialize pdo mysql错误 - 无效的数据源名称

时间:2012-06-18 23:16:13

标签: mysql serialization pdo php-5.3 shopping-cart

我的在线商店下面有这些课程。

这个超类包含子类使用的所有常用方法。

class grandpa
{
    public function test1($string)
    {
        return $string;
    }
}

PDO连接也是如此,

class database_pdo extends grandpa
{
    protected $connection = null;
    protected $dsn,$username,$password;

    public function __construct($dsn,$username,$password)
    {
        $this->dsn = $dsn;
        $this->username = $username;
        $this->password = $password;
        $this->get_connection();
    }

    public function get_connection()
    {
        try
        {
            $this->connection = new PDO($this->dsn, $this->username, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
            $this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
        }
        catch (PDOException $e) 
        {
            $this->get_error($e);
        }
    }

    public function __sleep()
    {
        return array('dsn', 'username', 'password');
    }


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

    public function get_error($e) 
    {
        $this->connection = null;
        die($e->getMessage());
    }

    public function __destruct()
    {
       $this->connection = null;
    }
}

我有这个类从pdo扩展到其他需要pdo连接的常用方法,

class papa extends database_pdo
{
    protected $connection = null;

    public function __construct($connection)
    {
        $this->connection = $connection;

    }

    public function test2($string)
    {
        return $string;
    }

}

儿童班,

class kido_1 extends papa
{

    public function __construct($connection)
    {
        parent::__construct($connection);
    }

    public function test3($string)
    { 
        return $string;
    }
}

如何使用上述类

# Host used to access DB.
define('DB_HOST', 'localhost');

# Username used to access DB.
define('DB_USER', 'xxx');

# Password for the username.
define('DB_PASS', 'xxx');

# Name of your databse.
define('DB_NAME', 'xxx'); 

# Data source name.
define('DSN', 'mysql:host='.DB_HOST.';dbname='.DB_NAME);

$connection = new database_pdo(DSN,DB_USER,DB_PASS);

$kido = new kido($connection);

$_SESSION['cart'] = serialize($kido);

$kido = unserialize($_SESSION['cart']);

print_r($kido->test3('hello'));

我收到此错误,

  

无效的数据源名称

unserialize()导致我的购物车数据需要它...

我该如何解决这个问题?或者更好的方法来重写这些类?

2 个答案:

答案 0 :(得分:1)

您的papa::connection是PDO对象。因此,当您尝试序列化$kido时,您正在尝试序列化资源which is not possible。 尝试在$this->connection = null;方法中添加database_pdo::__sleep()

答案 1 :(得分:0)

我认为是一个解决方案......

class papa extends grandpa
{
    protected $connection = null;

    public function __construct($connection)
    {
        $this->connection = $connection;

    }

    public function test2($string)
    {
        return $string;
    }

}