在cookie PHP中取消数组的序列化


Unserialize Array in cookie PHP

我当前正在创建一个具有名称和值的cookie(序列化的对象数组):

include_once './Model/Winkelwagenitem.php';
$winkelwagenProduct = array (
        //aantal + ID
        new WinkelwagenItem(1,257),
        new WinkelwagenItem(3,258),
        new WinkelwagenItem(1,259)
);    
$cookie_name = "winkelwagen";
$cookie_value = serialize($winkelwagenProduct);;
setcookie($cookie_name, $cookie_value); 
//echo "Data to be stored (serialized): ".$cookie_value."<br>";
if(!isset($_COOKIE[$cookie_name])){
        echo "Cookie not being set";
} else {
        echo "cookie created";
}

一切顺利。现在在另一个php文件中,我访问了这个cookie,我需要取消它的序列化并返回cookie中的对象:

 if(isset($_COOKIE["winkelwagen"])){
    echo "Deze cookie (".$_COOKIE["winkelwagen"].") bestaat";
    foreach ($_COOKIE["winkelwagen"] ....){
        .....
        unserialize(....)
        ....
    }
} else {
    echo "deze cookie bestaat niet";
}

我真的不知道前臂循环中会发生什么?

请帮忙?

我创建了一个函数来取消数组的序列化,下面是函数:

function _unserialize($data)
{
    $data = @unserialize(strip_slashes($data));
    if (is_array($data))
    {
        foreach ($data as $key => $val)
        {
            if (is_string($val))
            {
                $data[$key] = str_replace('{{slash}}', '''', $val);
            }
        }
        return $data;
    }
    return (is_string($data)) ? str_replace('{{slash}}', '''', $data) : $data;
}

也许这会帮助你。。。

您不需要对cookie变量进行迭代。您在cookie中存储的只是一个值,因为您正在序列化。

因此,当您想要使用这些对象时,需要取消序列化并使用。

你的代码应该是这样的:

if(isset($_COOKIE["winkelwagen"])){
    //! You have your array of object here, use it as required
    $winkelwagenProduct = unserialize($_COOKIE["winkelwagen"]);
} else {
    echo "deze cookie bestaat niet";
}

一些提示:

  • 您需要在取消序列化WinkelwagenItem的页面上包含它的类定义
  • 饼干的尺寸有限,不要储存太大的东西
  • 客户端在每次HTTP请求时都会发送所有cookie。也就是说,cookie数据越重,每个HTTP请求就越重。所以不要把不必要的东西放在饼干里