2011-01-12 38 views
6

我喜歡這個PHP如何字符串化陣列和存儲在cookie的

$值= {陣列( '身份證'=> $ ID, '電子郵件'=> $電子郵件的數組, '令牌'=> $令牌)}

我想串起數組,然後編碼,然後將它存儲在cookie「登錄」。你是怎樣做的 ?也請告訴我如何解碼和讀取存儲的值。

編輯:

我一直在試圖序列化/反序列化,但如預期沒有奏效。例如,

$value = serialize(array('id'=>33, 'email'=>'[email protected]', 'token'=>'e9aa0966773d68e0fbf9cb21fc2877b4')); 

echo $value; //a:3:{s:2:"id";i:33;s:5:"email";s:20:"[email protected]";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 
+1

該cookie永遠不會是純文本。原因在於它如何存儲在HTTP標頭中。 `Cookie:`頭文件使用冒號和分號等字符作爲分隔符,因此需要將它們轉義出來(PHP基本上接受cookie的值並執行[url_encode](http://php.net/manual/en/function)。 urlencode.php)在輸出到客戶端之前) – 2011-01-12 18:14:31

+0

這樣讀取cookie值我必須先url_decode? – 2011-01-12 18:22:44

+0

在php中,url_decode應該在構建$ _COOKIE superglobal時自動發生。 – 2011-01-12 18:28:58

回答

10

有一個serialize/unserialize功能數組轉換爲字符串和背部。

編輯: 當您將一個字符串存儲到cookie(setcookie)時,php需要對字符串進行url編碼。這可以防止保存到cookie的字符串中的任何字符干擾任何其他標題。接下來加載頁面時,PHP獲取cookie並自動對cookie值進行url解碼,以將其返回到之前的值。至於存儲在cookie中的內容,這在php內不應該存在,因爲php會自動執行url編碼/解碼。現在,如果您使用另一種語言(如JavaScript)獲取cookie,那麼是的,您將收到原始字符串。在這種情況下,你可以在JS中使用類似decodeURI的東西來獲取原始值。

11

json_encode/json_decode

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

也可以用serialize/unserialize

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

也許。


UPDATE

有了這個代碼:

<html><body><pre><?php 
    $array = Array(
    'id' => 1234, 
    'email' => '[email protected]', 
    '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) "[email protected]" 
    ["token"]=> 
    string(16) "YWJjREVGMTIzNA==" 
} 
Serialized: 
a:3:{s:2:"id";i:1234;s:5:"email";s:19:"[email protected]";s:5:"token";s:16:"YWJjREVGMTIzNA==";} 
Unserialized: 

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

編輯2

您將看到基於HTTP協議如何傳輸cookie的編碼值。在cookie傳輸中有兩個標題:Set-Cookie & Cookie。一個是server-> client,另一個是client-> server,恭敬地。

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

如果你有一個像:或空格,瀏覽器將不知道在哪裏cookie的屬性開始並結束。