Sessions/foreach 我的购物车有问题

Sessions/foreach issue with my shopping cart

这个问题实际上是另一个问题的延续。我想确保我在这一篇中陈述了所有细节。

我和 Php 一样是一个相对较新的程序员,我的任务是制作购物车

我从数据库中获取我的产品数据 -> 然后我点击一个产品 -> 它会转到一个页面,在该页面中将产品 ID、产品名称和价格添加到与 array_push 的会话中,然后结束up back on the same page with where the cart is (购物车与产品线在同一页面上)

cart.class.php -> 这是我最初从中接收产品数据的页面。通过使用我的 getAllproducts();我获取了所有数据,然后循环遍历这些数据以显示 6 种产品。

<?php

class Cart
{
private $con;
private $productid;

function __construct(){
    $this->con = new PDO('mysql:host=localhost;dbname=#', '#', '#');
}

public function getProductDataById($passedId){

    $this->productid = $passedId;

    $statement = $this->con->prepare("SELECT productname, productdescription, productimage, price FROM producten WHERE productid = :productid");
    $statement->execute(array("productId" => $this->productid));
    $data = $statement->fetch();

    return($data);
}
public function getAllproducts(){

    $statement = $this->con->prepare("SELECT productid, productname, productdescription, productimage, price FROM producten");
    $statement->execute();
    $data = $statement->fetchAll();

    return($data);
}
}
?>

接下来我用Cart.php来展示我的产品。在此页面上,我循环浏览产品,然后当有人点击订单 (bestellen) productid 时,产品名称和价格将发送到 add_to_cart.php

<?php
/*errors */
error_reporting(E_ALL);
ini_set("display_errors", 1);

/*Php classes */
require_once("../classes/cart.class.php");

$products = new cart();
$data = $products->getAllproducts();

?>
<title>Side Cart</title>
</head>
<body>
<header>
    <div id="cd-cart-trigger"><a class="cd-img-replace" href="#0">Cart</a></div>

<div class="container productline">
    <div class="row">
    <?php
    foreach($data as $value){

        echo '<div class="col-md-4 productcage">';
        echo '<h2 class="product_name">'.$value["productname"].'</h2>';
        echo '<p class="price_tag">€'.$value["price"].' euro</p>';
        echo '<p class="#">'.$value["productdescription"].'...</p>';
        echo '<a href="/shoppingcart/php/add_to_cart.php?productid='.$value["productid"] . "&productname=" . $value["productname"]. "&price=" . $value["price"].'" class="btn btn_order addcart">Add to cart <span class="glyphicon glyphicon-shopping-cart"></span></a><br/><br/>';
        echo '</div>';
    }
    ?>
    </div>
</div>
<div id="cd-shadow-layer"></div>
 // Here's where the shopping cart starts 
<?php

session_start();

if(isset($_SESSION["cart"]) && count($_SESSION["cart"])> 0)

{

echo '<div id="cd-cart">';
echo '<h2>Cart</h2>';
echo '<ul class="cd-cart-items">';
echo '<li>';

 foreach($_SESSION['cart'] as $id => $value)
{
    echo 'Product Name ' . $value["productname"] . '<br/>';
    echo 'Product ID ' . $value["productid"] . '<br/>';
    echo 'Product Price ' . $value["price"] . '<br/>';
    echo '<br/>';
}

echo '</li>';
echo '</ul>';
echo '<div class="cd-cart-total">';
echo '<p>Total <span>.96</span></p>';
echo '</div>';

echo '<a href="#0" class="checkout-btn">Checkout</a>';
echo '<p class="cd-go-to-cart"><a href="#0">Go to cart page</a></p>';
echo '</div>';

}

?>

那我去add_to_cart.php

这会将会话发送回 cart.php,我想在下方循环购物车中的产品

<?php
 session_start();

 if(empty($_SESSION['cart'])){
 $_SESSION['cart'] = array();
 }

 array_push($_SESSION['cart'], $_GET['productid'], $_GET['productname'], $_GET['price']);

 ?>

  <p>Het product is toegevoegd aan uw winkelwagen</p> <a href="../cart.php">Naar winkelwagen</a>

TL;DR 当我尝试遍历 $value["productname"] 我的 foreach returns 警告:非法字符串偏移量 'productname'

我不知道如何完成所有这些工作,因为我仍然是 PHP 的初学者。如果有人愿意花时间找出我愚蠢的错误,那就太棒了。

希望我说得够清楚了。对于给您带来的不便,我们深表歉意

 foreach($_SESSION['cart'] as $id => $value)
 {
    echo ($_SESSION[ 'cart' ][ $id ] . " " . $value); //1 1solexfiets1 solexfiets115.99 15.99
    var_dump(($_SESSION[ 'cart' ][ $id ] . " " . $value)); // string(3) "1 1" string(23) "solexfiets1 solexfiets1" string(11) "15.99 15.99"
}

我已将 array_push 更改为

 array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price']));

当我 print_r 在 cart.php 上时,我得到以下回复

Array ( [0] => 1 [1] => solexfiets1 [2] => 15.99 [3] => Array ( [productid] => 1 [productname] => solexfiets1 [price] => 15.99 ) )

但是当我尝试像这样遍历它时

   foreach($_SESSION['cart'] as $id => $value)
{
    echo 'Product Name ' . $value["productname"] . '<br/>';
    echo 'Product ID ' . $value["productid"] . '<br/>';
    echo 'Product Price ' . $value["price"] . '<br/>';
    echo '<br/>';
}

我仍然遇到同样的错误

Warning: Illegal string offset 'productname'

所以我还有哪里做错了吗?我现在明白我需要发送一组东西而不是我以前做的,但我仍然不太明白为什么它现在失败了

非常感谢大家对我的帮助! 我似乎已经解决了问题。我听取了每个人的建议,终于有了一个有效的 foreach 语句。现在产品已订购并将出现在购物车中

再次感谢所有帮助过我的人!

抱歉,我没有看到你有新问题,所以我把这个作为对你另一个问题的评论。

用这个替换你的array_push,如果对你有用,请告诉我。

array_push($_SESSION['cart'], array('productid' => $_GET['productid'], 'productname' => $_GET['productname'], 'price' => $_GET['price']));

您的问题是您正在将相关数据推送到一个数组 ($_SESSION['cart']) 但没有维护该关系 - 这样想:

$_GET 是一个包含一堆数据的数组 - 当您引用该数组的特定部分(例如($_GET['productname'])时,您正在将其从其集合中删除并对其进行处理- 使用你的 array_push 你只是将东西推入另一个数组 ($_SESSION['cart']) 而不是保持关系 - 所以你将一堆东西推入 $_SESSION['cart']一次又一次,他们都迷路了——他们不再保持彼此之间的关系。

我们所做的是推送一个包含您想要的事物的数组(集合),因此 $_SESSION['cart'] 现在包含多个事物集合,而不仅仅是事物。

另一种思考方式是——你可以这样做:

array_push($_SESSION['cart'], $_GET); 

这会产生相同的效果,因为我们将 $_GET 数组推入我们的另一个数组,因此关系得以维持 - 您不想这样做的原因是,在我上面的示例中,我们创建一个只包含我们需要的数据的新数组。如果我们只是将整个 $_GET 数组推到那里,我们可能会得到一堆我们不需要的其他东西(用户可以放置 &someothervariable=aReallyReallyLongString),然后它们也会在我们的会话中结束。

<?php
    session_start();

    $_SESSION[ 'cart' ] = array();

    array_push( $_SESSION[ 'cart' ], array( 'productid' => 1, 'productname' => 'product1', 'productprice' => 15.99 ) );
    array_push( $_SESSION[ 'cart' ], array( 'productid' => 2, 'productname' => 'product2', 'productprice' => 4.99 ) );
    array_push( $_SESSION[ 'cart' ], array( 'productid' => 3, 'productname' => 'product3', 'productprice' => 17.99 ) );

    foreach( $_SESSION[ 'cart' ] AS $arr )
        echo $arr[ 'productname' ] . ' ';
?>