PHP PDO - 無法序列化或反序列化 PDO 實例 (PHP PDO - cannot serialize or unserialize PDO instances)


問題描述

PHP PDO ‑ 無法序列化或反序列化 PDO 實例 (PHP PDO ‑ cannot serialize or unserialize PDO instances)

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;
    }

}

‑‑‑‑‑

參考解法

方法 1:

PDO objects contain active links to databases (which may have a transaction initiated or db session settings and variabiles). 

You cannot serialize a PDO object because the above would get lost and cannot be re‑established automatically.

You should redesign your classes to access the current database link statically using a separate class (dedicated for holding db connections), instead of saving a reference in a member variable (I supose this is happening when you do new cart($connection))).

方法 2:

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.

(by RunoxygenChris Gutierrez)

參考文件

  1. PHP PDO ‑ cannot serialize or unserialize PDO instances (CC BY‑SA 3.0/4.0)

#shopping-cart #serialization #PHP #pdo






相關問題

PHP PDO - 無法序列化或反序列化 PDO 實例 (PHP PDO - cannot serialize or unserialize PDO instances)

Prestashop 在註冊表單中添加額外字段 (Prestashop Add extra fields to registration form)

接近購物車存儲,帶有 sessionID 的數據庫 (Approach shopping cart storage, database with sessionID)

購物車不工作,我想哭 (Shopping cart won't work and I want to cry)

如何在 UITableView 中使用 dequeueReusableCellWithIdentifier 快速管理購物車? (How to manage shopping cart in UITableView with dequeueReusableCellWithIdentifier in swift?)

如何區分 Rs 和 % 值? (How to differentiate Rs and % values?)

貝寶購物車的運費之一 (One of delivery charge for paypal shopping cart)

ZenCart 中的優惠券問題 (Coupon problem in ZenCart)

PAYPAL 貨幣不起作用 (PAYPAL currency is not working)

RESTful 購物車網絡服務 (RESTful Shopping Cart web service)

Gravity Form 不適用於結帳頁面 (Gravity Form doesn't work with Checkout Page)

帶有對象的數組,單擊按鈕後增加/減少對像中的值之一 (Array with objects, increasing/decreasing one of the value in object after click on button)







留言討論