2013-05-01 59 views
0

我写了下面一段代码,它在Firefox中正常工作。Cookie正在被覆盖而不是创建一个新的

// 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浏览器读取的cookies以相反的顺序Firefox没有,所以我们假设定义了以下cookie:cart [1],cart [2],cart [3]。Firefox按照这个顺序排列,所以当我添加一个新的cookie时,它被存储为购物车[4],而Safari相反,做$指针永远是1 + 1,把它作为车[2]我每次添加一个新产品的时间。

我试图解决这个的方法很多,但至今未果。

谢谢。

回答

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

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

+0

只要他们不删除从cookie什么。我假设这是一个购物车,所以他们可能会。 – 2013-05-01 22:50:45

+0

不要再次遇到你的情况,但你最好使用json_encode/json_decode。 Serialize可以允许远程执行的代码。类有一个__wakeup魔术方法,它被反序列化调用。尽管实际上他们应该只使用会话,但这不再是一个问题。 – 2013-05-01 23:02:10

+0

是的,我最终只使用会话。无论如何感谢您的回复;) – 2013-05-22 14:20:17

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