0

要素をカートに追加するときに、セッションの上書きに問題があります。

$_SESSION["cart"] 要素はセッションのままですが、新しい要素を追加すると前の要素が上書きされ、セクションを変更してショップに戻るとリセットされてしまい、なぜそうなのかわかりません。ハプニング。

このスレッドPHP: $_SESSION 内の「オブジェクト」の保存を確認しましたが、セッションの変更前に session_start() があります。このスレッドInteral Server Error 500 - session_start()も確認しましたが、サーバー phpinfo() を確認した後、それを得ました

Directive               Local Value     Master Value
session.save_handler    files           files

Product、Presentation、Cart の 3 つのクラスがあります。

プレゼンテーションには製品があり、カートにはプレゼンテーションがあります。

クラス製品

class Product {

    private $id;
    private $name;
    private $sku;
    private $weight;
    private $existence;
    private $minimum_existence;
    private $url;
    private $images;

    private $db;
    private $lang;

    public function __construct($id,$lang="es") {
        $this -> id = $id;
        $this -> db = new PDO(DB_CONNECTION,DB_USER,DB_PASS,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        $this -> lang = $lang;

        $this -> images = array();
        $this -> get_info();
    }

    public function __destruct() {
        unset($this);
    }

    public function get_info() {
        $info_product = $this -> db -> prepare("SELECT shop_products.*, shop_products_images.* FROM shop_products JOIN shop_products_images ON shop_products.id_product=shop_products_images.id_product WHERE shop_products.id_product=".$this -> id." AND shop_products_images.principal=1");
        $info_product -> execute();
        $info = $info_product -> fetch();

        $this -> id = $info["id_product"];
        $this -> name = $info["product_name_".$this -> lang];
        $this -> sku = $info["product_sku"];
        $this -> weight = $info["product_weight"];
        $this -> existence = $info["product_existence"];
        $this -> minimum_existence = $info["product_minimum_existence"];
        $this -> url = $info["product_url_".$this -> lang];
        $this -> images["original"] = $info["image_original"];
        $this -> images["big"] = $info["image_big"];
        $this -> images["medium"] = $info["image_medium"];
        $this -> images["small"] = $info["image_small"];
        $this -> images["thumbnail"] = $info["image_thumbnail"];
    }

    //

    public function get_name() {
        return $this -> name;
    }

    public function get_sku() {
        return $this -> sku;
    }

    public function get_weight() {
        return $this -> weight;
    }

    public function get_existence() {
        return $this -> existence;
    }

    public function get_minimum_existence() {
        return $this -> minimum_existence;
    }

    public function get_url() {
        return $this -> url;
    }

    public function get_image($size) {
        return $this -> images[$size];
    }

}

クラス発表

class Presentation {

    private $id;
    private $name;
    private $description;
    private $capacity;
    private $weight;
    private $price;
    private $discount;
    private $url;
    private $images;

    private $products;

    private $db;
    private $lang;

    public function __construct($id,$lang="es") {
        $this -> id = $id;
        $this -> db = new PDO(DB_CONNECTION,DB_USER,DB_PASS,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        $this -> lang = $lang;
        $this -> images = array();

        $this -> products = array();

        $this -> get_info();
    }

    public function __destruct() {
        unset($this);
    }

    public function get_info() {
        $info_presentation = $this -> db -> prepare("SELECT * FROM shop_product_presentations WHERE id_presentation=".$this -> id);
        $info_presentation -> execute();
        $info = $info_presentation -> fetch();

        $this -> name = $info["presentation_name_".$this-> lang];
        $this -> description = $info["presentation_description_".$this-> lang];
        $this -> capacity = $info["presentation_capacity"];
        $this -> weight = $info["presentation_weight"];
        $this -> price = $info["presentation_price"];
        $this -> discount = $info["presentation_discount"];
        $this -> url = $info["presentation_url_".$this-> lang];

        $this -> images["original"] = $info["presentation_image_original"];
        $this -> images["medium"] = $info["presentation_image_medium"];
        $this -> images["small"] = $info["presentation_image_small"];
    }

    //

    public function add_product($id_product,$quantity=1) {
        if($this -> get_quantity() < $this -> capacity) {
            if(isset($this -> products[$id_product])) {
                if($quantity > $this -> get_left()) {
                    $quantity = $this -> get_left();
                }           
                $this -> products[$id_product]["quantity"] += $quantity;

                if($this -> products[$id_product]["quantity"] == 0) {
                    unset($this -> products[$id_product]);
                }

            } else {
                $this -> products[$id_product]["product"] = new Product($id_product);
                $this -> products[$id_product]["quantity"] = $quantity;
            }
        } else {
            return false;
        }
    }

    public function total_weight() {
        $weight = $this -> weight;

        foreach($this -> products as $p) {
            $weight += ($p["product"] -> get_weight() * $p["quantity"]);
        }

        return $weight;
    }

    public function display() {

    }

    //

    public function get_name() {
        return $this -> name;
    }

    public function get_description() {
        return $this -> description;
    }

    public function get_capacity() {
        return $this -> capacity;
    }

    public function get_quantity() {
        $x = 0;
        foreach($this -> products as $p) {
            $x += $p["quantity"];
        }
        return $x;
    }

    public function get_left() {
        return $this -> capacity - $this -> get_quantity();
    }

    public function get_weight() {
        return $this -> weight;
    }

    public function get_price() {
        return $this -> price;
    }

    public function get_discount() {
        return $this -> discount;
    }

    public function get_url() {
        return $this -> url;
    }

    public function get_image($size) {
        return $this -> images[$size];
    }

    public function get_products() {
        foreach($this -> products["product"] as $p) {
            $p -> get_info();
        }
        return $this -> products;
    }

}

クラスカート

class Cart {

    private $id;
    private $start_datetime;
    private $end_datetime;
    private $id_customer;

    private $presentations;

    public function __construct($id_customer=0) {
        $this -> id = md5(uniqid(mt_rand()));
        $this -> start_datetime = date("Y-m-d H:i:s");
        $this -> end_datetime = date("Y-m-d H:i:s", strtotime($this -> start_datetime) + 1800);
        $this -> id_customer = $id_customer;

        $this -> presentations = array();
    }

    public function __destruct() {
        unset($this);
    }

    //

    public function add_presentation($presentation) {
        array_push($this -> presentations,$presentation);

        $this -> end_datetime = date("Y-m-d H:i:s", strtotime($this -> end_datetime) + 600);
    }

    public function remove_presentation($index) {
        unset($this -> presentations[$index]);
    }

    public function get_subtotal() {
        $subtotal = 0.00;
        foreach($this -> presentations as $p) {
            $p -> get_info();
            $subtotal += $p -> get_price();
        }
        return number_format($subtotal,2,".","");
    }

    public function get_taxes($percentage) {
        return number_format($this -> get_subtotal() * $percentage,2,".","");
    }

    public function get_total($percentage) {
        return number_format($this -> get_subtotal() + $this -> get_taxes($percentage),2,".","");
    }

    public function get_total_weight() {
        $weight = 0.00;
        foreach($this -> presentations as $p) {
            $weight += $p -> total_weight();
        }
        return number_format($weight,2,".","");
    }

    //

    public function get_id() {
        return $this -> id;
    }

    public function get_start_datetime() {
        return $this -> start_datetime;
    }

    public function get_end_datetime() {
        return $this -> end_datetime;
    }

    public function get_id_customer() {
        return $this -> id_customer;
    }

    public function set_id_customer($id_customer) {
        $this -> id_customer = $id_customer;
    }

    public function get_presentations() {
        return $this -> presentations;
    }


}

さて、head.php ファイルにあるハンドラーは次のとおりです。

require_once("lib/dbconfig.php");

    require_once("lib/class.product.php");
    require_once("lib/class.presentation.php");
    require_once("lib/class.cart.php");

session_start();

if(isset($_SESSION["gandj_customer"])) { $id_customer = $_SESSION["gandj_customer"]["id_customer"]; }
    else { $id_customer = 0; }

    if(isset($_SESSION["cart"]))
    {
        if($_SESSION["cart"] -> get_end_datetime() < date("Y-m-d H:i:s"))
        {
            $_SESSION["cart"] = new Cart($id_customer);
        }
        if($_SESSION["cart"] -> get_id_customer() == 0 && $id_customer != 0)
        {
            $_SESSION["cart"] -> set_id_customer($id_customer);
        }
    }
    else
    {
        $_SESSION["cart"] = new Cart($id_customer);
    }

    if($seccion == "shop") {

        switch($_POST["action"]) {

            case "add":

                $pres = new Presentation($_POST["id_presentation"]);
                $pres -> get_info();

                foreach($_POST["cantidad"] as $key => $cantidad) {                  
                    if($cantidad > 0) {
                        $pres -> add_product($key,$cantidad);
                    }   
                }

                $_SESSION["cart"] -> add_presentation($pres);

                header("Location: /shop/");

            break;


        }

    }

私が遭遇する問題は...

ステップ 1: ショップ セクションを開くと、print_r が次のように出力されます。

Cart Object
(
    [id:private] => c3ceee39137d55cbf6db97b67dc90cdc
    [start_datetime:private] => 2013-06-07 12:46:36
    [end_datetime:private] => 2013-06-07 13:16:36
    [id_customer:private] => 0
    [presentations:private] => Array
        (
        )

)

ステップ 2: ランダムなプレゼンテーションを追加すると、それが正しく表示され、機能で説明されているように、セッション カートの終了時刻まで 10 分を広告します。

    Cart Object
    (
        [id:private] => c3ceee39137d55cbf6db97b67dc90cdc
        [start_datetime:private] => 2013-06-07 12:46:36
        [end_datetime:private] => 2013-06-07 13:26:36
        [id_customer:private] => 0
        [presentations:private] => Array
            (
                ...
    this part displays correctly

...
            )

    )

ステップ 3: URL からセクションを再度開くことにしました。これは私が出力のために得るものです。お気付きのように、元の日時は変更されていないため、 $_SESSION カート オブジェクトは同じままであると思われます。

Cart Object
(
    [id:private] => c3ceee39137d55cbf6db97b67dc90cdc
    [start_datetime:private] => 2013-06-07 12:46:36
    [end_datetime:private] => 2013-06-07 13:16:36
    [id_customer:private] => 0
    [presentations:private] => Array
        (
        )

)

私の仮定の 1 つは、Presentation オブジェクトと Product オブジェクトをセッションに追加するときにそれらを適切に処理していないということですが、以前は同様の手順を使用しており、正常に機能しています。助言がありますか?

編集:

しばらくして、元の Cart オブジェクトは変更されていませんが、セッションに新しいものは何も追加されないため、セッションの問題であることがわかりました。手順を実行した瞬間に追加されますが、ページ全体で永続的ではありません。そして、どこにでも session_start() があります。

私は gettext と他のいくつかのセッション変数を処理していますが、これが何らかの影響を与えるかどうかはわかりません。

4

1 に答える 1

0

私が抱えていた問題はデータベースでした。どうやら PDO にはセッション処理との競合があるため、クラスのパラメーターとして渡す際に問題が発生していました。

私の問題を解決したのは、このクラスを使用することでした: https://gist.github.com/tony-landis/31464

私はそれが誰かを助けることを願っています:)

于 2013-07-02T20:28:05.083 に答える