PHP как структурировать массив и сохранить в cookie - PullRequest
6 голосов
/ 12 января 2011

Я получил такой массив

$ 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 ]

13 голосов
/ 12 января 2011

json_encode / json_decode

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

Можно также использовать сериализовать / unserialize :

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

Возможно.


UPDATE

С этим кодом:

<code><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);
?>

Вы бы сгенерировали следующее:

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 & 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');

Если бы у вас были такие символы, как : или пробел, браузер не знал бы, где начинались и заканчивались свойства куки.

10 голосов
/ 12 января 2011

существует serialize / unserialize функция для преобразования массива в строку и обратно.

Edit: Когда вы сохраняете строку в cookie ( setcookie ), php необходимо выполнить url-кодирование строки. Это предотвращает любые символы в строке, сохраненные в cookie, мешающие другим заголовкам. Когда страница загружается следующей, php получает cookie и автоматически выполняет URL-декодирование значения cookie, чтобы вернуть его к предыдущему значению. Что касается того, что хранится в куки, это не должно иметь значения в php, потому что php автоматически выполняет кодирование / декодирование URL. Теперь, если вы получаете cookie на другом языке, таком как javascript, тогда да, вы получите необработанную строку обратно. В этом случае вы можете использовать что-то вроде decodeURI в JS, чтобы вернуть исходное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...