0

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

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 或名称。预先感谢

4

2 回答 2

1

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

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

编辑

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

索引.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");

购物车.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类是连接到数据库的推荐且安全的方式。你的代码很容易像@Touki 在他的评论中所说的那样受到 SQL 注入的影响。

于 2013-04-29T10:54:51.547 回答
0

我建议只执行一个查询来检索所有产品,然后迭代查询结果以填充 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 注入的影响,理想情况下,输入应该在放入查询字符串之前进行清理。

于 2013-04-29T10:40:09.887 回答