PHP如何在cookie中字符串化数组和存储

时间:2011-01-12 17:53:06

标签: php

我有一个像这样的数组

$ value = {array('id'=> $ id,'email'=> $ email,'token'=> $ token)}

我想对数组进行字符串化然后编码然后将其存储在cookie“login”中。你是怎样做的 ?另请告诉我如何解码和读取存储的值。

编辑:

我一直在尝试序列化/反序列化,但它没有按预期工作。例如,

$value = serialize(array('id'=>33, 'email'=>'big@gmail.com', 'token'=>'e9aa0966773d68e0fbf9cb21fc2877b4'));

echo $value; //a:3:{s:2:"id";i:33;s:5:"email";s:20:"big@gmail.com";s:5:"token";s:32:"e9aa0966773d68e0fbf9cb21fc2877b4";}

但是当值转到cookie时,它看起来像这样

a%3A3%3A%7Bs%3A2%3A%22id%22%3Bs%3A1%3A%226%22%3Bs%3A5%3A%22email%22%3Bs%3A20%3A%22craigcosmo%40gmail.com%22%3Bs%3A5%3A%22token%22%3Bs%3A32%3A%22e9aa0966773d68e0fbf9cb21fc2877b4%22%3B%7D

2 个答案:

答案 0 :(得分:13)

json_encode / json_decode

$_COOKIE['login'] = json_encode($array);
$array = json_decode($_COOKIE['login']);

还可以使用serialize / unserialize

$_COOKIE['login'] = serialize($array);
$array = unserialize($_COOKIE['login']);

也许


<强>更新

使用此代码:

<html><body><pre><?php
  $array = Array(
    'id'  => 1234,
    'email' => 'example@example.com',
    'token' => base64_encode('abcDEF1234')
  );

  echo "Var Dump (initial):\r\n";
  var_dump($array);

  $serialized = serialize($array);
  echo "Serialized:\r\n".$serialized."\r\n";

  $unserialized = unserialize($serialized);
  echo "Unserialized:\r\n".$unserailized."\r\n";
  var_dump($unserialized);
?></pre></body></html>

您将生成以下内容:

Var Dump (initial):
array(3) {
  ["id"]=>
  int(1234)
  ["email"]=>
  string(19) "example@example.com"
  ["token"]=>
  string(16) "YWJjREVGMTIzNA=="
}
Serialized:
a:3:{s:2:"id";i:1234;s:5:"email";s:19:"example@example.com";s:5:"token";s:16:"YWJjREVGMTIzNA==";}
Unserialized:

array(3) {
  ["id"]=>
  int(1234)
  ["email"]=>
  string(19) "example@example.com"
  ["token"]=>
  string(16) "YWJjREVGMTIzNA=="
}

<强> EDIT2

您将看到基于HTTP协议传输Cookie的编码值。 Cookie转移中有两个标头:Set-Cookie&amp; Cookie。一个是服务器 - >客户端,另一个是客户端 - >服务器,尊重。

当PHP设置cookie时(使用setcookie),PHP实际上只是简短地处理以下内容:

setcookie('login',$serialized);

,在PHP中转换为:

header('Set-Cookie: login='.urlencode($serialized).'; '
      .'expires=Wed, 12-Jan-2011 13:15:00 GMT; '
      .'path=/; domain=.mydomain.com');

如果你有像:或SPACE这样的字符,浏览器就不知道cookie的属性开始和结束的位置。

答案 1 :(得分:10)

有一个serialize / unserialize函数可以将数组转换为字符串并返回。

编辑: 当您将字符串存储到cookie(setcookie)时,php需要对字符串执行url编码。这可以防止保存到cookie的字符串中的任何字符干扰任何其他标头。当接下来加载页面时,php获取cookie并自动对cookie值进行url解码,以将其返回到之前的值。至于存储在cookie中的内容,这在php中无关紧要,因为php会自动执行url编码/解码。现在,如果您使用其他语言(如javascript)获取cookie,那么是的,您将获得原始字符串。在这种情况下,您可以在JS中使用类似decodeURI的内容来获取原始值。