目前,我正在从事计算机科学工作,我选择开一家网上商店,我使用了一个教程制作购物篮,并且一切正常,除了我只能删除除添加到购物车中的第一个商品外的所有商品。 。如果可能,我将非常感谢您的帮助。
这是我的购物车中的商品的显示位置(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');
?>
答案 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
可能是主键,因此他不太可能拥有id
为0
的项目,所以empty()应该完全适合他的需求。为了阐明这一点,OP,Barmar是正确的,如果实际上有 个基于0的id
,则您想使用isset($_GET['remove'])
而不是{{ 1}}
有关差异,请参见http://php.net/isset和http://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) {
它将完全相同。