无法删除我购物篮中的第一件商品

时间:2019-03-01 20:40:45

标签: php html mysqli project

目前,我正在从事计算机科学工作,我选择开一家网上商店,我使用了一个教程制作购物篮,并且一切正常,除了我只能删除除添加到购物车中的第一个商品外的所有商品。 。如果可能,我将非常感谢您的帮助。

这是我的购物车中的商品的显示位置(cart.php):

<?php 
session_start();
require_once('db.php'); 
include('common.php');
 ?>

 <?php getHeader(); ?>

<div class="container">
    <div class="row">
      <table class="table">
            <?php 
                $items = $_SESSION['cart'];
                $cartitems = explode(",", $items);
            ?>

            <?php
                $total = '';
                $i=1;
                 foreach ($cartitems as $key=>$id) {
                    $sql = "SELECT * FROM products WHERE id = $id";
                    $res = mysqli_query($con, $sql);
                    $r = mysqli_fetch_assoc($res);
            ?>      
                <tr>
                    <td><?php echo $i; ?></td>
                    <td><a href="delcart.php?remove=<?php echo $key; ?>">Remove</a> <?php echo $r['name']; ?></td>
                    <td>£<?php echo $r['price']; ?></td>
                </tr>
            <?php 
                $total = $total + $r['price'];
                $i++; 
                } 
            ?>

            <tr>
                <td><strong>Total Price</strong></td>
                <td><strong>£<?php echo $total; ?></strong></td>
                <td><a href="#" class="btn btn-info">Checkout</a></td>
            </tr>
        </table>
    </div>
</div>
<?php getFooter(); ?>

这是我的代码,可将商品添加到购物车(addtocart.php):

    <?php
session_start();
if(isset($_SESSION['cart']) & !empty($_SESSION['cart'])){
    $items = $_SESSION['cart'];
    $cartitems = explode(",", $items);
    $items .= "," . $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');
}else{
    $items = $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');
}


if(in_array($_GET['id'], $cartitems)){
    header('location: index.php?status=incart');
}else{
    $items .= "," . $_GET['id'];
    $_SESSION['cart'] = $items;
    header('location: index.php?status=success');   
}   
?>

这是我的删除商品代码(delcart.php):

<?php 
session_start();
$items = $_SESSION['cart'];
$cartitems = explode(",", $items);
if(($_GET['remove']) & !empty($_GET['remove'])){
    $delitem = $_GET['remove'];
    unset($cartitems[$delitem]);
    $itemids = implode(",", $cartitems);
    $_SESSION['cart'] = $itemids;
}
header('location:cart.php');
?>

4 个答案:

答案 0 :(得分:2)

问题是这一行:

if ($_GET['remove'] & !empty($_GET['remove']))

当您要删除第一项时,$_GET['remove']0,这是错误的,也被认为是空的,因此本应删除的代码不会运行。更改为:

if (isset($_GET['remove']) && is_numeric($_GET['remove']))

此外,在整个脚本中,当您应该使用&时,您都在使用&&&是按位与,&&是逻辑与。

答案 1 :(得分:1)

在会话中只有一项时,

$cartitems = explode(",", $items);

结果是带有“ 0”索引的数组,因此,如果要删除最后一个值,$ _ GET ['remove']应该等于“ 0”(例如:www.site.loc /?remove = 0)< / p>

我希望您只向我们展示示例代码(而非生产代码),因为这是非常错误的书面示例和危险示例:

  

$ sql =“ SELECT * FROM产品ID = $ id的产品”;永远不要使用!

答案 2 :(得分:1)

您的代码有些错误:

1)$ _SESSION ['cart']似乎是一串用逗号分隔的id,即string(10) "1, 2, 3, 4"

因此,$cartitems = explode(",", $items)将返回这些ID的数组,即array(4)[ 1, 2, 3, 4 ]

2)假设$_GET['remove']是一个包含项id的字符串,即3

调用unset($cartitems[$delitem])将删除示例数组4的最后一个元素,因为数组的索引为零。

要删除值3,您必须调用:

$delitem = array_search($_GET['remove'], $cartitems);
unset($cartitems[$delitem]);

(请参阅http://php.net/array_search

3)我可以建议使用PDO吗? http://php.net/manual/en/book.pdo.php

编辑:由于我无法发表评论,巴尔玛:

鉴于OP的项目存储在数据库中,并且id可能是主键,因此他不太可能拥有id0的项目,所以empty()应该完全适合他的需求。为了阐明这一点,OP,Barmar是正确的,如果实际上有 个基于0的id,则您想使用isset($_GET['remove'])而不是{{ 1}}

有关差异,请参见http://php.net/issethttp://php.net/empty

答案 3 :(得分:0)

您的循环然后使用变量是个问题:

                 foreach ($cartitems as $key=>$id) {
...
                      <td><a href="delcart.php?remove=<?php echo $id; ?>">Remove</a> <?php echo $r['name']; ?></td>
...
                 }                    

$key应该是$id

以这种方式使用foreach时,$key var是数组索引,而$id是值(可以是字符串,数组,对象,整数...)

http://php.net/manual/en/control-structures.foreach.php

但是由于您在这里不关心数组索引,因此可以从foreach声明中省略它:

                 foreach ($cartitems as $id) {

它将完全相同。