mysql - 反序列化 pdo mysql 错误 - 数据源名称无效

标签 mysql serialization pdo php-5.3 shopping-cart

我的在线商店有以下这些类(class)。

这个父类(super class)包含子类使用的所有常用方法。

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'));

我收到此错误,

invalid data source name

这是由 unserialize() 引起的,我需要它来存储我的购物车数据...

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

最佳答案

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

关于mysql - 反序列化 pdo mysql 错误 - 数据源名称无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11092399/

相关文章:

mysql - 使用字符串作为逗号分隔查询

php - 为什么我不写入我的数据库

MySql:按日期计算不同值的出现次数

php - 如何将行数组传递给 PDO 以插入它们?

php - 使用 'type' 列识别表的行

.net - 使用 .Net 使用 XmlSerializer 有什么限制(如果有的话)?

java - Jackson 序列化 - 忽略不设置的值,但提供显式设置为 null 的值

c# - JSON.NET 序列化在 ApiController 中的行为不同

在apache下连接到mssql时PHP超时

php - MySQL PHP pdo 插入值不起作用