【问题标题】:Unserialize Array in cookie PHP在 cookie PHP 中反序列化数组
【发布时间】:2015-04-06 09:31:21
【问题描述】:

我目前正在创建一个带有名称和值的 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";
}

我真的不知道 foreach 循环中必须包含什么?

请帮忙?

【问题讨论】:

  • $_COOKIE["winkelwagen"] 只包含一个值,为什么需要循环,为什么不只是unserialize( $_COOKIE["winkelwagen"] )
  • 更多对象待添加
  • 如何向 cookie 中的同一个键添加更多对象?如果您的意思是向序列化数组中添加更多内容,那没关系,您将在未序列化后对其进行迭代
  • 就像@adeneo 所说,如果您的价值不是一个价值。尝试先检查它,您需要一个函数来首先检查您的数据类型。检查我的答案,也许你对那个功能有所了解。 :)

标签: php arrays cookies serialization


【解决方案1】:

我已经创建了一个反序列化数组的函数,这里是函数:

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

也许这会对你有所帮助...

【讨论】:

    【解决方案2】:

    您不需要遍历该 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 的类定义
    • Cookie 的大小有限,不要存储太大的东西。
    • 客户端在每次 HTTP 请求时都会发送所有 cookie。这意味着,cookie 数据越重,每个 HTTP 请求就越重。所以不要在cookies中存储不必要的东西。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 2014-05-21
      • 2012-12-23
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多