6

cartからクラスに PDO 接続を渡す必要がありますcontroller

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

 }

このエラーが発生します。

致命的なエラー: C:\wamp\www\store_2012_MVC\local\controllers\class_base_extended_cart.php:89 でメッセージ「PDO インスタンスをシリアル化または非シリアル化できません」を含む例外「PDOException」をキャッチできません:89 スタック トレース: #0 [内部関数]: 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 C:\wamp\www\store_2012_MVC でスローされる {main} \local\controllers\class_base_extended_cart.php 行 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;
    }

}
4

2 に答える 2

4

PDOオブジェクトには、データベースへのアクティブなリンクが含まれています(データベースには、トランザクションが開始されるか、dbセッションの設定と変数が含まれる場合があります)。

上記が失われ、自動的に再確立できないため、PDOオブジェクトをシリアル化することはできません。

メンバー変数に参照を保存するのではなく、別のクラス(db接続を保持するための専用)を使用して現在のデータベースリンクに静的にアクセスするようにクラスを再設計する必要があります(これは新しいcart($ connection)を実行するときに発生すると思います)) 。

于 2012-06-07T17:35:09.423 に答える
1

__sleep および __wakeup マジック メソッドを見てください。 http://us.php.net/manual/en/language.oop5.magic.php#object.sleep

これらを使用すると、シリアル化するプロパティと無視するプロパティを指定できます。問題は、PDO オブジェクトのインスタンスを定期的に渡す必要があることです。

于 2012-06-07T17:23:27.857 に答える