PHP, как строчить массив и хранить в cookie

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

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

Я хочу, чтобы строка массива затем закодировать, а затем сохранить его в cookie «login». Как ты это делаешь ? Также, пожалуйста, скажите мне, как декодировать и читать сохраненное значение.

Редактировать:

Я пытался сериализовать / unserialize, но он не работал должным образом. например,

$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 

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

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

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 & 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.