I need to pass a PDO connection into a cart class from a controller,
function __construct($connection)
{
$this->cart = new cart($connection);
}
but I think the problem is with serialize()
public function render_page()
{
if (!isset($_SESSION[SESSION_CART]))
{
$cart = $this->cart;
}
else
{
$cart = unserialize($_SESSION[SESSION_CART]);
}
$_SESSION[SESSION_CART] = serialize($cart);
}
I get this error,
Fatal error: Uncaught exception ‘PDOException’ with message ‘You
cannot serialize or unserialize PDO instances’ in
C:\wamp\www\store_2012_MVC\local\controllers\class_base_extended_cart.php:89
Stack trace: #0 [internal function]: 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}
thrown in
C:\wamp\www\store_2012_MVC\local\controllers\class_base_extended_cart.php
on line 89
How can I fix this?
Or can I use something else instead of serialize()?
EDIT:
I tried it with __sleep and __wakeup magic methods but still get the same error,
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;
}
}
Take a look at the __sleep and __wakeup magic methods.
http://us.php.net/manual/en/language.oop5.magic.php#object.sleep
They allow you to specify which properties get serialized and which get ignored. The issue there is that you’ll need to regularly pass in an instance of your PDO object.