0

我编写了以下在 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,所以让我们说以下 cookie定义:购物车[1],购物车[2],购物车[3]。Firefox按此顺序排列,所以当我添加一个新的时,它被存储为购物车[4],而Safari则相反,总是使$指针为 1+1,每次添加新产品时将其存储为购物车 [2]。

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

谢谢。

4

2 回答 2

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;
}
于 2013-05-01T22:57:32.050 回答
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;
}

然后您可以使用这些功能与您的购物车进行交互。

于 2013-05-01T22:49:01.497 回答