2013-05-01 52 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; 
}