获取数组购物车php


Fetching array cart php

我有一个问题。我将购物车存储在数组会话中,如下所示

session_start();
$id= $_GET['id'];
if(isset($_SESSION['cart']))
{
array_push($_SESSION['cart'], $id);
}
else
    $_SESSION['cart']= array($id);
header("location:cart.php");

当我试图检索购物车时。我得到的产品id与我放入购物车的数量相同。

<?php
if(!isset($_SESSION['cart'])) {
    echo "Your cart is empty.<br /><br /><a href='products.php'>Show products</a>";
} else {
    echo '<table border="0.2">';
    $total_price = 0;
    foreach($_SESSION['cart'] as $id) {
        $the_query = "select * from products where id='$id' GROUP BY id";
        $result = mysql_query($the_query) or die('Query failed: ' . mysql_error());
        $the_product = mysql_fetch_array($result, MYSQL_ASSOC);
        $total_price = $total_price + $the_product['price'];
        $href = "show_products.php?id=".$the_product['id'];
        //echo "<tr>";
        echo "<tr><td><a href='$href'>";
        echo "<img src='".$the_product['image_url_small']."' /></a></td>";
        echo "<td><strong>".$the_product['name']."</strong></td><td><em>$".$the_product['price']."</em>";
        echo "</td>";
        echo "<td> <a href='do_deletecart.php?id=". $the_product['id'] ."'>Delete item </a></td></tr>";
    }
    echo "<tr><td colspan='2'></td></tr>";
    echo "<tr><td style='text-align:center;font-size:40px;'>$</td><td><strong>Total</strong><br /><em>$".$total_price."</em></td></tr>";
    echo "</table>";
    echo "<br /><a href='empty_cart.php'>Empty Cart</a> <a href='showallproducts.php'>Show phones</a><br /><br />";
}

我如何使它只显示一个产品id或名称。提前致谢

如果我正确理解您的问题,您将获得相同产品id的许多结果。这是因为您在$_SESSION变量中多次存储相同的id值。

您可以执行以下操作以避免在$_SESSION变量中重复相同的id。

编辑

为了完整起见,我已经更新了代码。希望对你有帮助。

index . php

<?php
session_start();
$id= isset($_GET['id']) ? $_GET['id'] : null;
if(!is_null($id)){
    if(isset($_SESSION['cart']) && count($_SESSION['cart']) > 0){
        // increment product quantity if already exists
        // or create a new one
        add_or_increment_product_to_cart($id, $_SESSION['cart']);
    } else {
        // initialize cart
        // add the first product
        $_SESSION['cart'] = array();
        array_push($_SESSION['cart'], (object) array('id' => $id, 'quantity' => 1));
    }
}
function add_or_increment_product_to_cart($id, $cart){
    foreach ($cart as $key => $product) {
        if($id == $product->id){
            $product->quantity++;
            return;
        }
    }
    array_push($_SESSION['cart'], (object) array('id' => $id, 'quantity' => 1));
}
header("location:cart.php");

Cart.php

<?php
session_start();
$cart = isset($_SESSION['cart']) ? $_SESSION['cart'] : null;
if($cart) {
    foreach ($cart as $key => $product) {
        $the_query = "SELECT * FROM products WHERE id=" . $product->id . " LIMIT 1";
        // your code to fetch the products from the database
        // what you have done is fine but vulnerable
        // PDO recommended 
    }
} else {
    echo "Your cart is empty.<br /><br /><a href='products.php'>Show products</a>";
}

还请注意,mysql_connect已弃用,PDO类是连接到数据库的推荐和安全方式。你的代码很容易受到SQL注入的攻击,就像@Touki在他的评论中说的。

我建议只执行一个查询来检索所有产品,然后迭代查询的结果来填充HTML。例如,

$the_query = "select * from products where id in (". implode(',', $_SESSION['cart']) .")";
$result = mysql_query($the_query);
while (($the_product = mysql_fetch_array($result, MYSQL_ASSOC))) {
    ...
}

这样做的额外好处是,您只执行一个查询,并且每个产品只选择一行。

值得注意的是,mysql_*方法已被弃用,建议开始使用其他库,如mysqli或PDO。

与此相关的是,这段代码目前很容易受到SQL注入的影响,在将输入放入查询字符串之前,理想情况下应该对输入进行消毒。