在PHP cookie中存储和检索数组

19
我希望能够存储一些来自“虚拟”索引卡的数据。每张卡片都有正反两面,用户可以存储多张卡片。每一面都会有数据。
I ----------------- I I CARD 1 FRONT I I------------------I
I --------------- I I CARD 1 BACK I I-----------------I
I ----------------- I I CARD 2 FRONT I I------------------I
I --------------- I I CARD 2 BACK I I-----------------I

好的,我的图表有点混乱。但您已经得到了信息。 :)

从上面的图表中想像一下。我想将每张卡片的数据 (正反面) 存储在 cookie 中,作为一个数组 (或许),然后能够取回每个值并将其插入到适当的位置 (在另一个页面上)。

同时,请记住用户可以制作任意数量的卡片。不能使用 POST 或 GET 函数。这个数组部分是有争议的,如果您能想到一种更简单的方法来存储这些数据在 cookie 中,请告诉我。请注意:不建议存储在数据库中,因为对于该项目来说并不方便。 :)


你有代码示例吗?因为帖子作者说他的代码错了。我无法确定分号应该放在哪里。 - 728883902
请在 meta 上提问,我不明白为什么你的问题与 SO 相关性完全一致。 - davidkonrad
展示一个数组的例子。 - davidkonrad
好的,我想要存储每张卡片的正面值和背面值,例如:卡片1 正面 卡片1 背面 卡片2 正面 卡片2 背面...但是用户可以创建几乎无限数量的卡片。 :) - 728883902
@MajidFouladpour,你为什么插入了与主题无关的“数据”值? - davidkonrad
显示剩余3条评论
3个回答

48

使用 json_encode/json_decode 将数组存储到 cookie 中或从 cookie 中获取已存储的数组。

测试数组

$cardArray=array(
    'CARD 1'=>array('FRONT I', 'BACK I'),
    'CARD 2'=>array('FRONT 2', 'BACK 2')
);

转换并写入cookie

$json = json_encode($cardArray);
setcookie('cards', $json);

保存的字符串看起来像这样

{"CARD 1":["FRONT I","BACK I"],"CARD 2":["FRONT 2","BACK 2"]}

拿回Cookie

$cookie = $_COOKIE['cards'];
$cookie = stripslashes($cookie);
$savedCardArray = json_decode($cookie, true);

展示恢复后的数组

echo '<pre>';
print_r($savedCardArray);
echo '</pre>';

输出

Array
(
    [CARD 1] => Array
        (
            [0] => FRONT I
            [1] => BACK I
        )

    [CARD 2] => Array
        (
            [0] => FRONT 2
            [1] => BACK 2
        )

)

编辑
如果你想知道 stripslashes 是什么,那是因为实际保存的字符串是这样的


{\"CARD 1\":[\"FRONT I\",\"BACK I\"],\"CARD 2\":[\"FRONT 2\",\"BACK 2\"]}

setcookie函数在引号前添加反斜杠以对其进行转义。如果不去除这些反斜杠,则会导致json_decode函数执行失败。


编辑 II

要向cookie中添加新卡片,请执行以下操作:

  1. 按照上面的方法加载数组
  2. $savedCardArray['CARD XX']=array('FRONT XX', 'BACK XX');
  3. 按照上述方式保存数组,但现在使用$savedCardArray而不是$cardArray

1
不客气!关于 stripslashes 的解释请看编辑部分,我忘记了。 - davidkonrad
计数函数能够用来统计用户已经创建了多少张卡片吗? - 728883902
1
是的。结果是一个完全正常的数组 - count($savedCardArray) 和所有其他数组函数都可用。 - davidkonrad
尝试了代码,看起来运行良好。但是当用户添加新卡时,我有点困惑。我理解我必须拉回 cookie 并添加新卡 - 一旦我返回 cookie,将新卡数据添加到 cookie 的逻辑方式是什么? - 728883902
1
json_encode的第二个参数不应该是“true”。这应该是在json_decode的第二个参数。 - Darryl
显示剩余3条评论

3

序列化/反序列化作为json_encode / json_decode的简单替代方案。

使用setcookie('cookiename', serialize(array), ...)将数据保存到cookie中。

使用unserialize($_COOKIE['cookienam'])来检索数组。


2

试着玩一下这个东西

<?php

$card_id = '123';
$value = 'im a black lady';

setcookie("card[$card_id][front]", $value);

// reload page to actually read the cookie

echo $_COOKIE['card'][$card_id]['front']; // im a black lady

?>

关于卡片ID,我应该如何提取/存储多个卡片值?对不起,我理解有些欠缺。谢谢! :) - 728883902
你需要一些独特的标识来识别每张卡片及其正反面的值。如何定义取决于你的结构。也许可以使用用户ID设置卡片,并从用户卡1开始递增+1,以标识每张卡片。你可以通过计算$_COOKIE['user_id']的数量并从计数结果中递增卡片编号,或者如果这足够的话,直接对它们进行编号而不进行用户识别。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接