我的购物车的会话/问题


Sessions/foreach issue with my shopping cart

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

是一个相对较新的程序员,比如Php,我有这个任务,我必须制作一个购物车

我从数据库中获取我的产品数据 ->然后我点击一个产品 ->它进入一个页面,在该页面中,它将产品ID,产品名称和价格添加到与array_push的会话中,然后它最终回到与购物车所在的同一页面上(购物车与产品线在同一页面上)

购物车.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);
}
}
?>

接下来,我使用购物车.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>$39.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

这会将会话发送回购物车.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["产品名称"] 我的 foreach 返回警告:非法字符串偏移量"产品名称"

我不知道如何使所有这些工作,因为我仍然是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购物车时.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/>';
}

我仍然收到相同的错误

警告:非法字符串偏移量"产品名称"

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

非常感谢大家对我的帮助!我似乎已经解决了这个问题。我采纳了大家的建议,终于有了一套有效的声明。现在产品已订购并将显示在购物车中

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

抱歉,

我没有看到您有新问题,所以我将其作为对您的另一个问题的评论。

用这个替换你的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' ] . ' ';
?>