运行时Cookie被设置为null

时间:2016-03-17 02:43:33

标签: php cookies

让我先给你代码并在下面解释一下:

<?php
$productID = $_POST['productID'];
$productAmount = $_POST['productAmount'];

//Declare variables
$cartNumItems = 0;

//Check if cookie exists and set variable if it does
if(isset($_COOKIE['cart'])){
    if($_COOKIE['cart'] != null && $_COOKIE['cart'] != ''){
        $cart = $_COOKIE['cart'];
    }
}

//Get array from cookie
if(isset($cart)){
    //Decode array from $cart variable and store it
    $cartArray = json_decode($cart);
    //Count number of items in $cart
    $cartAmount = count($cartArray);

    for($i = 0; $i < $cartAmount; $i++){
        //Check if $cart has the same product in it already
        if($productID == $cartArray[$i][0]){
            //Add to the amount of that product
            $cartArray[$i][1] += $productAmount;
            break;
        }
        //If it does not have the same product already, just add a new one
        else if($i == ($cartAmount - 1)){
            array_push($cartArray, array($productID, $productAmount));
            break;  
        };
    };

    //Recount number of items in $cart
    for($i = 0; $i < $cartAmount; $i++){
        $cartNumItems += $cartArray[$i][1];
    };

    //Encode $cart so it can be stored in cookie
    $cartRaw = json_encode($cartArray);

    //Create cookies
    setcookie('cart', $cartRaw, time() + (86400 * 7), '/');
    setcookie('cartNumItems', $cartNumItems, time() + (86400 * 7), '/');

    echo 'true';
}
else{
    //Create the info that needs to be put into cookie
    $cart = json_encode(
        array(
            array($productID, $productAmount)
        )
    );

    $cartArray = json_decode($cart);
    //Count and store the amount of items in cart array
    $cartAmount = count($cartArray);

    //Store amount of items in $cartNumItems variable
    for($i = 0; $i < $cartAmount; $i++){
        $cartNumItems += $cartArray[$i][1];
    };

    //Create cookies
    setcookie('cart', $cart, time() + (86400 * 7), '/');
    setcookie('cartNumItems', $cartNumItems, time() + (86400 * 7), '/');

    echo 'true';
};
?>

第一次运行此代码时,未设置“cart”cookie。因此,在检查变量“$ cart”是否设置时,它会运行大的else语句。 else语句工作正常,并做了它应该做的事情。它创建一个二维数组,然后创建包含所需信息的cookie。

代码第二次运行时,if语句应该运行。我相信它确实如此。 “cart”cookie(又名“$ cart”变量)设置为null。然后将“cartNumItems”cookie(又名“$ cartNumItems”变量)设置为0.这是不应该做的。我无法找到它的位置,或者为什么会这样做。

如果对问题代码的具体内容有任何疑问,这就是问题代码(看起来似乎):

//Get array from cookie
if(isset($cart)){
    //Decode array from $cart variable and store it
    $cartArray = json_decode($cart);
    //Count number of items in $cart
    $cartAmount = count($cartArray);

    for($i = 0; $i < $cartAmount; $i++){
        //Check if $cart has the same product in it already
        if($productID == $cartArray[$i][0]){
            //Add to the amount of that product
            $cartArray[$i][1] += $productAmount;
            break;
        }
        //If it does not have the same product already, just add a new one
        else if($i == ($cartAmount - 1)){
            array_push($cartArray, array($productID, $productAmount));
            break;  
        };
    };

    //Recount number of items in $cart
    for($i = 0; $i < $cartAmount; $i++){
        $cartNumItems += $cartArray[$i][1];
    };

    //Encode $cart so it can be stored in cookie
    $cartRaw = json_encode($cartArray);

    //Create cookies
    setcookie('cart', $cartRaw, time() + (86400 * 7), '/');
    setcookie('cartNumItems', $cartNumItems, time() + (86400 * 7), '/');

    echo 'true';
}

更新

我发现了什么重置了cookie,if语句中的这段代码:

//Decode array from $cart variable and store it
$cartArray = json_decode($cart);

运行此命令时,$ cartArray设置为null,因此其余代码正在处理null变量。现在我不明白为什么它被设置为null。当我var_dump $ cart变量时,我得到 string(16)“[[\”21 \“,\”1 \“]]”。但是当我跑步时......

echo json_decode($cart);

它只是空白。

1 个答案:

答案 0 :(得分:1)

由于[[\"21\",\"1\"]]个字符,

\无效JSON。那些不应该在第一位 - magic_quotes_gpc的时间消失了,除非你的PHP版本真的很旧。在对字符串调用json_decode之前删除它们。

因此,既然你说它不是在本地发生的,而是在你的web hoster的服务器上,很可能 这里负责的设置magic_quotes_gpc(如果你的PHP版本是&lt; ; = 5.3)。如果你的托管服务商没有提供任何办法(自定义php.ini,.htaccess),那么你可以使用get_magic_quotes_gpc()从你的脚本中检测它,然后使用f.e. stripslashes删除它们。

(另请查看get_magic_quotes_gpc()手册页上的用户评论,他们提供了通过几行脚本从所有外部输入数据中删除这些额外斜杠的解决方案。)