cookie被覆盖而不是创建一个新的

时间:2013-05-01 22:43:12

标签: php cookies foreach

我编写了以下代码,可以在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]。

我尝试了很多方法解决这个问题,但到目前为止还没有成功。

感谢。

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;
}