PHP PDO - 无法序列化或反序列化PDO实例

时间:2012-06-07 17:15:15

标签: php serialization pdo shopping-cart

我需要将PDO连接传递到cart的{​​{1}}类,

controller

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

serialize()

我收到此错误,

  

致命错误:未捕获的异常'PDOException',消息'You   无法序列化或反序列化PDO实例   C:\ WAMP \ WWW \ store_2012_MVC \本地\控制器\ class_base_extended_cart.php:89   堆栈跟踪:#0 [内部功能]:PDO-> __ sleep()#1   C:\瓦帕\ WWW \ store_2012_MVC \本地\控制器\ class_base_extended_cart.php(89):   serialize(对象(购物车))#2   C:\瓦帕\ WWW \ store_2012_MVC \本地\控制器\ 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 \本地\控制器\ class_base_extended_cart.php   第89行

我该如何解决这个问题?

或者我可以使用其他内容代替public function render_page() { if (!isset($_SESSION[SESSION_CART])) { $cart = $this->cart; } else { $cart = unserialize($_SESSION[SESSION_CART]); } $_SESSION[SESSION_CART] = serialize($cart); } 吗?

修改

我使用serialize()__sleep魔术方法尝试过,但仍然遇到同样的错误,

__wakeup

2 个答案:

答案 0 :(得分:3)

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

您无法序列化PDO对象,因为上述内容会丢失,无法自动重新建立。

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

答案 1 :(得分:1)

看看__sleep和__wakeup魔术方法。 http://us.php.net/manual/en/language.oop5.magic.php#object.sleep

它们允许您指定哪些属性被序列化以及哪些属性被忽略。问题在于您需要定期传递PDO对象的实例。