lau*_*kok 5 php serialization shopping-cart pdo
我需要将一个PDO连接传递给一个cart
类controller
,
function __construct($connection)
{
$this->cart = new cart($connection);
}
Run Code Online (Sandbox Code Playgroud)
但我认为问题在于 serialize()
public function render_page()
{
if (!isset($_SESSION[SESSION_CART]))
{
$cart = $this->cart;
}
else
{
$cart = unserialize($_SESSION[SESSION_CART]);
}
$_SESSION[SESSION_CART] = serialize($cart);
}
Run Code Online (Sandbox Code Playgroud)
我收到这个错误,
致命错误:C:\ wamp\www\store_2012_MVC\local\controllers\class_base_extended_cart.php中带有消息'您无法序列化或反序列化PDO实例'的未捕获异常'PDOException':89堆栈跟踪:#0 [内部函数]:PDO- > __ sleep()#1 C:\ wamp\www\store_2012_MVC\local\controllers\class_base_extended_cart.php(89):serialize(Object(cart))#2 C:\ wamp\www\store_2012_MVC\local\controllers\class_factory. php(75):base_extended_cart-> render_page()#3 C:\ wamp\www\store_2012_MVC\index.php(69):factory-> render()#4 {main}抛出C:\ wamp\www\store_2012_MVC第89行的\ local\controllers\class_base_extended_cart.php
我怎样才能解决这个问题?
或者我可以使用别的东西而不是serialize()
?
编辑:
我尝试了 __sleep
和__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;
}
}
Run Code Online (Sandbox Code Playgroud)
看一下 __sleep 和 __wakeup 魔术方法。 http://us.php.net/manual/en/language.oop5.magic.php#object.sleep
它们允许您指定哪些属性被序列化以及哪些属性被忽略。问题是您需要定期传入 PDO 对象的实例。