我正在构建购物车,我将订单保存在一个存储在会话中的多维数组$_SESSION['cart']
产品由
表示$product_array=array($id,$description,$price);
多维数组是$product_array.s
$id's
是唯一的。
问题是,当我想从多维$_SESSION['cart']
中移除产品时
基于id的数组,只要它只是购物车中的一个商品就有效,但如果更多,它不起作用,这些商品似乎被移除了,但是它的鬼魂&# #39;被放在购物车中。代码
是这样的:
//get $id, $count is elements in array
for ($r = 0; $r <= $count-1; $r++)
{
if($_SESSION['cart'][$r][0]=="$id")
{
unset($_SESSION['cart'][$r]);
echo "<div class=success>The item has been removed from your shopping cart.</div>";
break;
}
}
答案 0 :(得分:1)
尝试这个功能,这对我有用
function remove_product($id){
$id=intval($id);
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
if($id==$_SESSION['cart'][$i]['id']){
unset($_SESSION['cart'][$i]);
break;
}
}
$_SESSION['cart']=array_values($_SESSION['cart']);
if($_REQUEST['command']=='delete' && $_REQUEST['id']>0){
remove_product($_REQUEST['id']);
}
else if($_REQUEST['command']=='clear'){
unset($_SESSION['cart']);
}
else if($_REQUEST['command']=='update'){
$max=count($_SESSION['cart']);
for($i=0;$i<$max;$i++){
$id=$_SESSION['cart'][$i]['id'];
$q=intval($_REQUEST['qty'.$id]);
if($q>0 && $q<=999){
$_SESSION['cart'][$i]['qty']=$q;
}
else{
$msg='Some proudcts not updated!, quantity must be a number between 1 and 999';
}
}
}
答案 1 :(得分:0)
检查php.conf中是否启用了register_global。尝试使用以下语法来取消设置:
if($_SESSION['cart'][$r][0]=="$id") {
$_SESSION['cart'][$r] = NULL;// this is just to be sure =)
unset($_SESSION['cart'][$r], $cart[$r]);
echo "<div class=success>The item has been removed from your shopping cart.</div>";
break;
}
答案 2 :(得分:0)
以下代码有效,也许它可以帮助您找到您的错误:
session_start();
$i=0;
$_SESSION['cart'][]=array($i++,'sds',99);
$_SESSION['cart'][]=array($i++,'sds',100);
$_SESSION['cart'][]=array($i++,'sds',20);
$_SESSION['cart'][]=array($i++,'sds',10);
$id = 2;
$count = count($_SESSION['cart']);
for ($r=0;$r<$count;$r++)
{
echo "num=$r<br>";
if(isset($_SESSION['cart'][$r]) && $_SESSION['cart'][$r][0]==$id)
{
unset($_SESSION['cart'][$r]);
echo "The item has been removed from your shopping cart.<br>";
break;
}
}
session_write_close();
答案 3 :(得分:0)
如上所述,我认为问题与您的数组的布局以及您尝试在for循环或某些PHP设置中检查的内容有关。 您是否已启动会话?我可能会转而使用一系列产品参考。使用普通数组很快就会成为一个噩梦,你无意中引用错误的对象而没有任何警告等。使用格式良好的函数名称获取的封装对象有助于避免这种情况。 像
这样的东西$cart = array($productId => $quantity, $productId2 => $quantityOfSecondProduct);
然后有一个包含所有产品信息数据的数组
$products = array($product1...);
每个产品的类型为
class Product
{
$productId;
$productName;
$productDescription;
... etc
}
然后您将所有数据分开但可以轻松访问,并且您可以轻松地根据产品ID删除购物车中的一个或多个条目,但只需引用它并在数量为0时删除。
if(($cart[$productId] - $quantityToRemove) <= 0)
unset($cart[$productId]);
else
$cart[$productId] -= $quantityToRemove;
请注意,填充产品等应该最好从某些数据源完成,我也可以把整个购物车作为一个具有良好功能的类,并且应该有更多的错误检查;)