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

ang*_*iwi 6 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";}
Run Code Online (Sandbox Code Playgroud)

但是当值转到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
Run Code Online (Sandbox Code Playgroud)

Bra*_*tie 13

json_encode/json_decode

$_COOKIE['login'] = json_encode($array);
$array = json_decode($_COOKIE['login']);
Run Code Online (Sandbox Code Playgroud)

也可以使用序列化 /反序列化:

$_COOKIE['login'] = serialize($array);
$array = unserialize($_COOKIE['login']);
Run Code Online (Sandbox Code Playgroud)

也许.


UPDATE

使用此代码:

<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>
Run Code Online (Sandbox Code Playgroud)

您将生成以下内容:

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=="
}
Run Code Online (Sandbox Code Playgroud)

EDIT2

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

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

setcookie('login',$serialized);
Run Code Online (Sandbox Code Playgroud)

在PHP中转换为:

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

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

  • 啊......很少使用Jason编码.:-) (4认同)

Jon*_*uhn 10

有一个序列化 /非序列化函数将数组转换为字符串并返回.

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

  • -1 serialize将调用序列化类的构造函数.这很糟糕,因为它可能导致代码执行.不要在不受信任的数据上使用. (2认同)
  • @FabrícioMatté 是的,json_encode/decode 更安全。使用序列化/反序列化可以执行代码(反序列化调用 __wakeup 魔术方法,如果它存在于类中)。您永远不应该执行任何用户提交的代码,因为您永远无法真正 100% 验证它不是恶意的。json_encode/json_decode 不会调用此类方法,因此在处理用户提交的数据时更安全。不同之处在于 json 的长度更小,但会丢失一些数据类型。反序列化将返回特定类的实例,方法和所有。 (2认同)