【问题标题】:unserialize pdo mysql error - invalid data source name反序列化 pdo mysql 错误 - 数据源名称无效
【发布时间】:2012-06-18 23:16:13
【问题描述】:

我的网上商店有以下这些课程。

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

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() 引起的,我需要它来存储我的购物车数据...

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 对不起,我不太明白 - __sleep() 方法在 database_pdo 的类中,但不是 grandpa - 你的意思是 papa
    • 还删除了“[PDO object] initialized at construction-time”,我确实混淆了grandpapapa
    • 该死,sleep()database_pdo 类的一个方法。我真的很困惑;)我想是时候睡觉了。
    • 我认为我应该扩展 grandpa 而不是 database_pdo。请参阅下面的我的答案,现在可以正常工作。谢谢。
    【解决方案2】:

    我认为的解决方案...

    class papa extends grandpa
    {
        protected $connection = null;
    
        public function __construct($connection)
        {
            $this->connection = $connection;
    
        }
    
        public function test2($string)
        {
            return $string;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2012-06-11
      • 2020-02-26
      相关资源
      最近更新 更多