2012-06-07 113 views
4

我需要通過從controller一個PDO連接到cart類,PHP PDO - 不能序列化或反序列化PDO實例

function __construct($connection) 
{ 
    $this->cart = new cart($connection); 
} 

,但我認爲這個問題是serialize()

public function render_page() 
{ 

    if (!isset($_SESSION[SESSION_CART])) 
    { 
     $cart = $this->cart; 
    } 
    else 
    { 
     $cart = unserialize($_SESSION[SESSION_CART]); 
    } 

    $_SESSION[SESSION_CART] = serialize($cart); 

} 

我得到這個錯誤,

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

我該如何解決這個問題?

或者我可以使用別的東西而不是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; 
    } 

} 
+1

注意 - 如果你的類繼承自PDO並且你克隆了這個對象,你也會得到這個錯誤。在我的情況下,我設置$ obj-> pdo在克隆之前爲空。 – jerrygarciuh

回答

1

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

它們允許您指定哪些屬性被序列化,哪些被忽略。存在的問題是,您需要定期傳入PDO對象的實例。

+0

感謝您的回答。我剛剛嘗試過它們,但仍然遇到同樣的錯誤,請你看看我上面的編輯。謝謝。 – laukok

+1

你必須扭轉它。通過__sleep,你可以返回一系列想要序列化的屬性。重點是能夠排除不可序列化的屬性。例如:你的連接屬性。我之所以說這可能不是最好的解決方案,是因爲任何時候您從$ _SESSION全局訪問購物車時,都必須重置連接屬性。像... $ cart = $ _SESSION ['cart']; $ cart-> set_connection($ db) –

+0

感謝您的回覆。我認爲我已經對我的班級進行了返工... – laukok

3

PDO對象包含到數據庫(可能有事務啓動或數據庫會話設置和變量)的活動鏈接。

您無法序列化一個PDO對象,因爲上述內容會丟失並且無法自動重新建立。

你應該重新設計你的類,使用一個單獨的類(專用於保存數據庫連接)來靜態訪問當前數據庫鏈接,而不是在成員變量中保存一個引用(當你做新購物車時,連接)))。

+1

由於〜PHP 5.3.0它似乎__sleep和__wakeup已被標記爲PDOStatement和PDO的最終版,所以沒有更多的技巧可能:) –

相關問題