PHP PDO-无法序列化或取消序列化PDO实例
我需要从PHP PDO-无法序列化或取消序列化PDO实例,php,serialization,pdo,shopping-cart,Php,Serialization,Pdo,Shopping Cart,我需要从控制器将PDO连接传递到购物车类 function __construct($connection) { $this->cart = new cart($connection); } 但我认为问题在于serialize() 我得到这个错误 致命错误:未捕获异常“PDOException”,消息为“You” 无法序列化或取消序列化中的PDO实例 C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u
控制器
将PDO连接传递到购物车
类
function __construct($connection)
{
$this->cart = new cart($connection);
}
但我认为问题在于serialize()
我得到这个错误
致命错误:未捕获异常“PDOException”,消息为“You”
无法序列化或取消序列化中的PDO实例
C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php:89
堆栈跟踪:#0[内部函数]:PDO->#U sleep()#1
C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php(89):
序列化(对象(购物车))#2
C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u factory.php(75):
基本扩展购物车->呈现页面()#3
C:\wamp\www\store_2012_MVC\index.php(69):factory->render()
投入
C:\wamp\www\store\u 2012\u MVC\local\controllers\class\u base\u extended\u cart.php
在线89
我怎样才能解决这个问题
或者我可以用别的东西代替serialize()
编辑:
我用\uuu sleep
和\uuu 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;
}
}
看看“睡眠和唤醒”的神奇方法。
它们允许您指定哪些属性被序列化,哪些属性被忽略。问题是,您需要定期传入PDO对象的实例。PDO对象包含到数据库的活动链接(可能有事务启动或db会话设置和变量) 无法序列化PDO对象,因为上面的内容将丢失并且无法自动重新建立
您应该重新设计类,以便使用单独的类(专用于保存db连接)静态访问当前数据库链接,而不是将引用保存在成员变量中(我相信在执行new cart($connection)时会发生这种情况)。谢谢您的回答。我刚刚试过,但仍然得到相同的错误,请你看看我的编辑上面。谢谢,你得把它倒过来。使用_sleep,返回要序列化的属性数组。关键是能够排除不可序列化的属性。你的连接属性。我之所以说这可能不是最好的解决方案,是因为无论何时从$\u会话全局访问购物车,都必须重置连接属性。类似于$购物车=$\u会话['cart']$cart->set_connection($db)自~PHP5.3.0以来,似乎_sleep和_wakeup已被标记为PDO语句和PDO的final,因此不可能有更多的技巧:)旁注-如果您的类继承自PDO,并且您克隆了该对象,您也将收到此错误。在我的例子中,我在克隆之前将$obj->pdo设置为null。
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;
}
}