在 cookie 中存储 PHP 数组

在 cookie 中存储数组的正确方法是什么 代码示例:

$number_ticket=2;
$info[7][5]=1;
$info[8][5]=1;
172714 次浏览

Cookie 基本上是文本,因此可以通过将数组编码为 JSON 字符串来存储数组(请参见 json_encode)。请注意,您可以存储的字符串的长度是有限制的。

试试 serialize()。它将数组转换为字符串格式,然后可以使用 unserialize()将其转换回数组。像 WordPress 这样的脚本使用它将多个值保存到单个数据库字段中。

你也可以像 Rob 说的那样使用 json_encode(),如果你想读取 javascript 中的 cookie,它可能会很有用。

序列化数据:

setcookie('cookie', serialize($info), time()+3600);

然后取消序列化数据:

$data = unserialize($_COOKIE['cookie'], ["allowed_classes" => false]);

Data 之后,$info 和 $data 将具有相同的内容。

您还可以尝试在不同的 cookie 中编写不同的元素。Cookie 名称可以设置为数组名称,并且可以作为数组提供给 PHP 脚本,但是在用户的系统中存储单独的 Cookie。可以考虑 explix()设置一个具有多个名称和值的 cookie。不建议为此目的使用 Series () ,因为它可能导致安全漏洞。有关更多细节,请查看 Setcookie PHP 函数

在 Cookie 上使用序列化和非序列化是一种安全风险。用户(或攻击者)可以更改 cookie 数据,然后当您对其进行反序列化时,它可以在您的服务器上运行 PHP 代码。不应信任 Cookie 数据。使用 JSON 代替!

来自 PHP 的网站:

不要将不受信任的用户输入传递给 unserialize(),而不管 Allow _ classoptions值如何。由于对象实例化和自动加载,反序列化可能导致加载和执行代码,恶意用户可能会利用这一点。如果需要向用户传递序列化数据,请使用安全的标准数据交换格式,如 JSON (通过 json_decode()json_encode())。

要在 cookie 中存储数组值,首先需要将它们转换为字符串,因此下面是一些选项。

将 cookie 存储为 JSON

存储代码

setcookie('your_cookie_name', json_encode($info), time()+3600);

读代码

$data = json_decode($_COOKIE['your_cookie_name'], true);

如果您需要在前端使用 JavaScript 读取 cookie,JSON 也是一个很好的选择。

实际上,您可以使用任何将数组转换为字符串并将字符串转换回 一样数组的 encrypt_array_to_string/decrypt_array_from_string方法组。 例如,还可以对整数数组使用 explode/implode

警告: 不要使用序列化/反序列化

来自 PHP.net

enter image description here

Do not pass untrusted user input to unserialize().-任何来自 HTTP 的东西,包括 cookie 都是不可信的!

与安全有关的参考文献

作为一种替代解决方案,您也可以在不将数组转换为字符串的情况下进行此操作。

setcookie('my_array[0]', 'value1' , time()+3600);
setcookie('my_array[1]', 'value2' , time()+3600);
setcookie('my_array[2]', 'value3' , time()+3600);

之后,如果您将打印 $_COOKIE变量,您将看到以下内容

echo '<pre>';
print_r( $_COOKIE );
die();
Array
(
[my_array] => Array
(
[0] => value1
[1] => value2
[2] => value3
)


)

这是记录的 PHP 特性。

来自 PHP.net

Cookies names can be set as array names and will be available to your PHP scripts as arrays but separate cookies are stored on the user's system.

最近我为我的客户端创建了这个代码,我在这个代码中使用了 cookie 的数组,实际上这个代码最近被用户使用 cookies 浏览页面,希望它能帮助你... !

function curPageURL() { // get url
return 'http' . ((
!empty($_SERVER['HTTPS']) &&
$_SERVER['HTTPS'] !== 'off' ||
$_SERVER['SERVER_PORT'] == 443
) ? 's' : '') . '://' . $_SERVER['SERVER_NAME'] . (
$_SERVER['SERVER_PORT'] == 80 ? '' :  $_SERVER['SERVER_PORT']
) . $_SERVER['REQUEST_URI'];
}


$currentPage = curPageURL(); // call function
$counter = $_COOKIE['_counter']; // set counter variable


if(!$_COOKIE['_PAGES']){ // if _Pages cookie
$default = 1; // set default value to 1
setcookie("_counter",$default,time()+7200); // set counter cookie
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie
}
else{ // if ! _Pages cookie
$default = $counter+1; // set default value to +1
setcookie("_counter",$default,time()+7200); // set counter cookie
}




if(@in_array($currentPage, @$_COOKIE['_PAGES'])){ // if same url found
}
else{ // if new url found
setcookie("_PAGES[$default]",$currentPage, time()+3600); // set cookie
}




if($_COOKIE['_PAGES']){
foreach ($_COOKIE['_PAGES'] as $value){
echo "<a href='{$value}'>{$value}</a>";
}
}

只是找到了需要的东西。现在,我可以在 cookies 上存储访问过的产品,然后在它们返回到站点时显示给它们。

// set the cookies
setcookie("product[cookiethree]", "cookiethree");
setcookie("product[cookietwo]", "cookietwo");
setcookie("product[cookieone]", "cookieone");


// after the page reloads, print them out
if (isset($_COOKIE['product'])) {
foreach ($_COOKIE['product'] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name : $value <br />\n";
}
}

只有 这个决策帮助我在 cookie 中存储大量的数据类型数组。 非常有效,谢谢你,艾瑞克,你帮了我大忙。

define( 'COOKIE_PORTIONS' , '_piece_' );


function clearpieces( $inKey , $inFirst ) {
$expire = time()-3600;
   

for ( $index = $inFirst ; array_key_exists( $inKey.COOKIE_PORTIONS.$index , $_COOKIE ) ; $index += 1 ) {
setcookie( $inKey.COOKIE_PORTIONS.$index , '' , $expire , '/' , '' , 0 );
unset( $_COOKIE[$inKey.COOKIE_PORTIONS.$index] );
}
}


function clearcookie( $inKey ) {
clearpieces( $inKey , 1 );
setcookie( $inKey , '' , time()-3600 , '/' , '' , 0 );
unset( $_COOKIE[$inKey] );
}


function storecookie( $inKey , $inValue , $inExpire ) {
$decode = serialize( $inValue );
$decode = gzcompress( $decode );
$decode = base64_encode( $decode );
   

$split = str_split( $decode , 4000 );//4k pieces
$count = count( $split );
   

for ( $index = 0 ; $index < $count ; $index += 1 ) {
$result = setcookie( ( $index > 0 ) ? $inKey.COOKIE_PORTIONS.$index : $inKey , $split[$index] , $inExpire , '/' , '' , 0 );
}
   

clearpieces( $inKey , $count );
}


function fetchcookie( $inKey ) {
$decode = $_COOKIE[$inKey];
   

for ( $index = 1 ; array_key_exists( $inKey.COOKIE_PORTIONS.$index , $_COOKIE ) ; $index += 1 ) {
$decode .= $_COOKIE[$inKey.COOKIE_PORTIONS.$index];
}
   

$decode = base64_decode( $decode );
$decode = gzuncompress( $decode );
   

return unserialize( $decode );
}