我编写了以下代码,可以在Firefox中正常运行。
// add product
if( isset($_GET['add']) ) {
$pointer = 1;
foreach ($_COOKIE['cart'] as $posit => $value) {
$pointer = $posit+1;
}
setcookie('cart['.$pointer.']', $_GET['add'] , time() + 60*60*24*$cookie_cart , '/' );
header('Location: cart.php');
}
问题出在我用Safari尝试时(所以我猜其他浏览器也可能出现同样的问题。当foreach()函数运行时,Safari会以与Firefox相反的顺序读取cookie,所以让&# 39; s表示定义了以下cookie:cart [1],cart [2],cart [3] .Firefox按此顺序排列,所以当我添加一个新的时,它会被存储为cart [4],而Safari则会相反,使$指针始终为1 + 1,每次添加新产品时都将其存储为购物车[2]。
我尝试了很多方法解决这个问题,但到目前为止还没有成功。
感谢。
答案 0 :(得分:0)
看起来你甚至不需要循环,你可以做到
$position = count($_COOKIE['cart'])+1;
setcookie('cart['.$position.']',$_GET['add'] , time() + 60*60*24*$cookie_cart , '/' );
编辑:
更好的是这样的:
function addItem($id) {
$cart = unserialize($_COOKIE['cart']);
$cart[] = $id;
setcookie('cart', serialize($cart) , time() + 60*60*24*$cookie_cart , '/' );
}
function removeItem($id) {
$cart = unserialize($_COOKIE['cart']);
$cart = array_diff($cart, array($id));
setcookie('cart', serialize($cart) , time() + 60*60*24*$cookie_cart , '/' );
}
function getCart() {
$cart = unserialize($_COOKIE['cart']);
return $cart;
}
然后您可以使用这些功能与购物车互动。
答案 1 :(得分:0)
为获得下一把钥匙,我会更简单:
//initial value
$newKey = 0;
//if cart is set and is an array
if(isset($_COOKIE['cart']) && is_array($_COOKIE['cart'])){
//get the max value from the keys and add 1
$newKey = max(array_keys($_COOKIE['cart']))+1;
}