存储在PHP会话中的对象存储的值错误

存储在PHP会话中的对象存储的值错误,php,session,deep-copy,storing-data,Php,Session,Deep Copy,Storing Data,我已经创建了一个有效的购物车对象。但是当我试图将对象保存到会话中时,该对象的错误内容被存储。正在保存的值是从购物车中清除对象后的值,即空值 <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>Testing the Shopping Cart</title> </head> <body> <?ph

我已经创建了一个有效的购物车对象。但是当我试图将对象保存到会话中时,该对象的错误内容被存储。正在保存的值是从购物车中清除对象后的值,即空值

    <!doctype html>
<html lang="en">
<head>
 <meta charset="utf-8">
 <title>Testing the Shopping Cart</title>
</head>
<body>
<?php # cart.php
// This script uses the ShoppingCart and Item classes.
//error_reporting(0);
// Create the cart:
session_start();
try {

require('ShoppingCart.php');
require('userMenu.php');
$cart = new ShoppingCart();

// Create some items:
require('Item.php');
require ('Connect.php');

$conn=Connect::doConnect();

$query = "SELECT product_id, product_name, product_price from product";
$result = mysqli_query($conn, $query);
$i=0;
$w = array();
$new_cart;
if ($result->num_rows > 0) {
    // output data of each row
    echo '<table border='."1".'><form action="cart.php" method="post"><tr><td>';
    echo '<b>'."Id produs".'</td><td><b>'."Denumire".'</td><td><b>'."Pret".'</td><td>'."Numar de bucati solicitate".'</td></tr><tr>';
    while($row = $result->fetch_assoc()) {
        echo '<td>'.$row["product_id"].'</td><td>'. $row["product_name"].'</td><td>'. $row["product_price"]. '</td><td>
            <input type="input" value="0" name="quantity[]"><input type="hidden" value="'.$row["product_id"].'" name="item_adjust[]"></td>';
        echo '</tr>';
        $i++;
        $w[$i]=new Item($row["product_id"], $row["product_name"],$row["product_price"]);
        $cart->addItem($w[$i]);
        //$cart->deleteItem($w[$i]);    

    }
    echo '</td></tr><tr><td colspan="3"><input type="submit" value="Adauga in cosul de cumparaturi" name="adjQ"></td></tr></table>';
    //foreach ()

} else {
    echo "0 results";
}
$conn->close();

if($_POST["adjQ"]){

echo "In stoc avem ".$i." tipuri de produse";

// Update some quantities:
$cart_items_new = array_combine($_POST['item_adjust'],$_POST['quantity']);
foreach ($cart_items_new as $product_id=>$quantity){
    //$item=new Item($product_id,Item->);
    //Item $it;
    //->updateItem($item->getId($product_id), $qty);
    //$cart->updateItem(getId($product_id), $quantity);

    $conn=Connect::doConnect();

    $query1 = "SELECT product_id, product_name, product_price from product where 
    product_id='$product_id'";
    $result1 = mysqli_query($conn, $query1);
    $row1=mysqli_fetch_array($result1);

    if($quantity>0){
     $cart->updateItem($w[$product_id], $quantity);
        echo $product_id.$quantity."+".$row1["product_name"];
    }
    else{
        $cart->deleteItem($w[$product_id]);
    }


}


// Show the cart contents:
echo '<h2>Continutul cosului de cumparaturi (' . count($cart) . ' tipuri de produse)</h2>';
echo "The user is " . $_SESSION["user"] . ".<br>";
echo "User type is " . $_SESSION["user_type"] . ".";
$new_cart = unserialize(serialize($cart));
if (!$cart->isEmpty()) {

    foreach ($cart as $arr) {

        // Get the item object:
        $item = $arr['item'];

        // Print the item:
        printf('<p><strong>%s</strong>: %d @ $%0.2f bucata.<p>', $item->getName(), $arr['qty'], $item->getPrice());

    } // End of foreach loop!

} // End of IF.
}

echo '</td></tr><tr><td colspan="2"><input type="submit" value="Salveaza" name="session"></td><td></td></tr></form></table>';
if ($_POST['session'])
{
    echo "You entered the number ";
    $serialize_cart=serialize($new_cart);
    $_SESSION["cart"]=$serialize_cart;
 }

} 

catch (Exception $e) {

}
?>
</body>
</html>

测试购物车
嘿,我试过了
我不能测试它,因为我没有额外的文件和购物车对象,但它应该接近无错误

我有一个会话变量“cart”,如果存在,我们将其取消序列化并完成,然后可以编辑值并将其保存回去,依此类推

如果不存在,即第一次命中或购物车被删除,我们将从数据库中构建一个新购物车(这不适合仅用于测试,因为目前您正在将数据库中的每个项目添加到购物车?)

如果存在adjQ的post或get值,我们将修改cart对象的一些值,并将其保存回会话变量

如果showCart的post或get值存在,则输出当前购物车 要实现这一点,您可能需要调整购物车对象以支持所调用的变量以及getCount函数和getAllRows函数

我已经从购物车中删除了一个项目数组的附加存储(w)不确定这是干什么用的,因为您将数据存储在对象中,不需要复制它

所有的请求变量都应该被清理以防止注入攻击等等

我添加了一个隐藏字段来触发showCart请求

不管怎样,希望这有帮助

<?php
    session_start();
?>
<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Testing the Shopping Cart</title>
    </head>
    <body>
<?php # cart.php
// This script uses the ShoppingCart and Item classes.
//error_reporting(0);

    // Create the cart:
    require('ShoppingCart.php');
    require('userMenu.php');

    $rowCount = 0;

    if(isset($_SESSION['cart']))
    {
        echo "We have a stored cart in a Session variable, retrieving data ...";

        $cart = unserialize($_SESSION["cart"]);

        $rowCount = $cart->getCount();
    }
    else
    {
        $cart = new ShoppingCart();

        // Create some items:
        require('Item.php');
        require ('Connect.php');

        $conn=Connect::doConnect();

        $query = "SELECT product_id, product_name, product_price from product";
        $result = mysqli_query($conn, $query);

        $rowCount = $result->num_rows;

        if ($result->num_rows > 0) {
            // output data of each row
            while($row = $result->fetch_assoc()) {
                $cart->addItem(new Item($row["product_id"], $row["product_name"],$row["product_price"]));
            }
        }
        $conn->close();
    }

    if(isset($_REQUEST['adjQ']))
    {
        echo "In stoc avem ".$rowCount." tipuri de produse";

        // Update some quantities:
        $cart_items_new = array_combine($_POST['item_adjust'], $_POST['quantity']);
        foreach ($cart_items_new as $product_id=>$quantity) {
            if($quantity > 0) {
                $cart->updateItem($product_id, $quantity);

                $conn=Connect::doConnect();

                $query1 = "SELECT product_id, product_name, product_price from product where product_id='$product_id'";
                $result1 = mysqli_query($conn, $query1);

                $row1 = mysqli_fetch_array($result1);
                echo $product_id." ".$quantity." + ".$row1["product_name"];
            }
            else {
                $cart->deleteItem($product_id);
            }
        }

        // Show the cart contents:
        echo '<h2>Continutul cosului de cumparaturi (' . $rowCount . ' tipuri de produse)</h2>
        The user is ' . $_SESSION["user"] . '.<br>
        User type is ' . $_SESSION["user_type"] . '.';

        if (!$cart->isEmpty()) {
            foreach ($cart as $arr) {
                // Get the item object:
                $item = $arr['item'];
                // Print the item:
                printf('<p><strong>%s</strong>: %d @ $%0.2f bucata.<p>', $arr['item']->getName(), $arr['item']->getQuantity(), $arr['item']->getPrice());
            } // End of foreach loop!

            echo "Saving card to Session variable";
            //New_cart is only set in adjQ request prehaps this code should be there?
            $_SESSION["cart"] = serialize($cart);
        } // End of IF.
    }

    if(isset($_REQUEST['showCart']))
    {
        if ($cart->getCount() > 0) {
            // output data of each row
            echo '<table border='."1".'><form action="cart.php" method="post">';
            echo '<tr><td><b>'."Id produs".'</td><td><b>'."Denumire".'</td><td><b>'."Pret".'</td><td>'."Numar de bucati solicitate".'</td></tr>';
            foreach ($cart->getAllRows() as $row) {
                echo '
                    <tr>
                        <td>'. $row->getProductId() . '</td>
                        <td>'. $row->getName() . '</td>
                        <td>'. $row->getPrice() . '</td>
                        <td><input type="input" value="0" name="quantity[]"><input type="hidden" value="' . $row->getProductId() . '" name="item_adjust[]"/><input type="hidden" value="showCart" name="showCart"/></td>
                    </tr>';
            }
            echo '<tr><td colspan="3"><input type="submit" value="Adauga in cosul de cumparaturi" name="adjQ"></td></tr></table>';
        } else {
            echo "Cart is empty";
        }

    }
?>
</body>
</html>

测试购物车

我认为这与secound submit按钮有关,当按下该按钮时,它会清除表单并将这些值存储到新的序列化对象中。如果(isset($\u POST['session'])不起作用,请尝试使用。我得到一个错误:致命错误:对…\cart.php中的非对象调用成员函数isEmpty()。在调用第二个按钮之前,$new_cart具有相应的对象$cart值。调用名为session的按钮后,$new_Cart为空,不包含任何值。