2011-01-12 35 views
6

Tôi nhận được một mảng như thế nàyPHP cách xâu chuỗi và lưu trữ trong cookie

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

Tôi muốn xâu chuỗi sau đó mã hóa rồi lưu trữ trong "đăng nhập" cookie. Làm thế nào để bạn làm điều đó ? Ngoài ra xin vui lòng cho tôi biết làm thế nào để giải mã và đọc các giá trị được lưu trữ.

Chỉnh sửa:

Tôi đã thử serialize/unserialize, nhưng nó không hoạt động như mong đợi. ví dụ,

$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";} 

Nhưng khi giá trị đi đến cookie, nó trông như thế này

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 sẽ không bao giờ là văn bản thuần túy. Lý do là cách nó được lưu trữ trong tiêu đề HTTP. Tiêu đề 'Cookie:' sử dụng các ký tự như dấu hai chấm và dấu chấm phẩy cho các dấu phân cách, do đó chúng cần được thoát ra (PHP về cơ bản lấy giá trị của cookie và thực hiện một [url_encode] (http://php.net/manual/en/function. urlencode.php) trên nó trước khi xuất nó cho khách hàng) –

+0

để đọc giá trị cookie tôi phải url_decode đầu tiên? –

+0

trong url_decode php sẽ xảy ra tự động khi nó đang xây dựng superglobal $ _COOKIE. –

Trả lời

10

có một chức năng serialize/unserialize để chuyển đổi một mảng thành một chuỗi và ngược lại.

Chỉnh sửa: Khi bạn lưu chuỗi vào cookie (setcookie), php cần thực hiện mã hóa url trên chuỗi. Điều này ngăn cản bất kỳ ký tự nào trong chuỗi được lưu vào cookie can thiệp vào bất kỳ tiêu đề nào khác. Khi trang được tải tiếp theo, php sẽ nhận được cookie và tự động thực hiện giải mã url trên giá trị cookie để trả về giá trị trước đó của nó. Theo như những gì được lưu trữ trong cookie, điều này không quan trọng trong php vì php sẽ tự động giải mã/giải mã url. Bây giờ nếu bạn đang nhận được cookie trong một ngôn ngữ khác như javascript, sau đó có, bạn sẽ nhận được chuỗi thô trở lại. Trong trường hợp này, bạn có thể sử dụng một cái gì đó như decodeURI trong JS để lấy lại giá trị ban đầu.

+1

bạn đã cố gắng base64_encode chuỗi? Không nên được yêu cầu, nhưng nếu bạn đang gặp rắc rối, nó có thể sẽ không làm tổn thương và có thể giúp ngăn chặn các vấn đề với các ký tự không được mã hóa đúng cách tự động. –

+2

-1 serialize sẽ gọi hàm tạo của một lớp được tuần tự hóa. Điều này là xấu bởi vì nó có thể gây ra việc thực thi mã. Không sử dụng trên dữ liệu không đáng tin cậy. – goat

+0

@chris cảm ơn, tôi không biết điều đó. –

11

json_encode/json_decode

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

cũng có thể sử dụng serialize/unserialize:

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

lẽ.


CẬP NHẬT

Với mã này:

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

Bạn sẽ tạo ra những điều sau đây:

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==" 
} 

EDIT2

Bạn đang thấy giá trị được mã hóa dựa trên cách giao thức HTTP chuyển cookie. Có hai tiêu đề trong chuyển cookie: Set-Cookie & Cookie. Một là server-> client, khác là client-> server, trân trọng.

Khi PHP đặt cookie (sử dụng setcookie ví dụ:) PHP thực sự chỉ là ngắn bàn giao như sau:

setcookie('login',$serialized); 

đó, trong PHP dịch để:

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

Nếu bạn đã ký tự như : hoặc SPACE, trình duyệt sẽ không biết nơi thuộc tính của cookie đã bắt đầu và kết thúc.

+4

Ah ... mã hóa Jason hiếm khi được sử dụng. :-) –

+0

Ý của bạn là "Jason_encode"? hoặc là một lỗi đánh máy cho "json_encode"? –

+0

$ array sẽ thực sự là một STD_OBJECT trừ khi bạn chỉ định bạn muốn một mảng với tham số thứ 2 tùy chọn. –

Các vấn đề liên quan