【问题标题】:Storing and retrieving an array in a PHP cookie在 PHP cookie 中存储和检索数组
【发布时间】:2013-09-28 15:07:12
【问题描述】:

我希望从一些“虚拟”索引卡中存储一些数据。每张卡片有正反面,用户可以存储多张卡片。每一方都有数据。

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 中,请告诉我。请注意:不建议存储在数据库中,因为它不方便项目。 :)

【问题讨论】:

  • 由于发帖人说他的代码错误,您有代码示例吗?我不太清楚分号的位置。
  • reg PS:不知道为什么 - 你的问题完全相关,但请尝试在 meta 上提问
  • 显示数组示例
  • 嗯,我想存储每张卡的正面值和背面值,例如: CARD 1 FRONT CARD 1 BACK CARD 2 FRONT CARD 2 BACK ...但是用户可以创建几乎无限数量的卡片。 :)

标签: php arrays cookies


【解决方案1】:

使用json_encode / json_decode 获取/设置cookies中的数组。

测试数组

$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 在 quoutes 之前添加 \ 以逃避它们。如果你不摆脱这些,json_decode 将会失败。


编辑二

向 cookie 添加新卡

  1. 如上加载数组
  2. $savedCardArray['CARD XX']=array('FRONT XX', 'BACK XX');
  3. 如上保存数组,但现在当然是$savedCardArray 而不是$cardArray

【讨论】:

  • 不客气!请参阅编辑以获取有关条形斜杠的解释,忘记了。
  • 啊,是的,这就解释了。还有一个问题...如何打印/回显卡 1 的正面和背面结果?卡 1 是变量,然后 [0] 打印卡 1 的正面吗?
  • 是的! echo $savedCardArray['CARD 1'][0].' '.$savedCardArray['CARD 1'][1]; 将输出FRONT I BACK I
  • 是的。结果是一个完全正常的数组 - count($savedCardArray) 并且所有其他数组函数都可用。
  • json_encode 的第二个参数不应为“true”。那将是 json_decode 的第二个参数。
【解决方案2】:

Serialize/Unserialize 是 json_encode / json_decode 的更简单替代方法

setcookie('cookiename', serialize(array), ...) 保存到 cookie。

array = unserialize($_COOKIE['cookienam']) 检索数组。

【讨论】:

    【解决方案3】:

    玩这样的东西

    <?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,我将如何提取/存储多个卡值?很抱歉缺乏理解。
    • 您需要某种唯一的 id 来识别每张卡片及其正面/背面值。你如何定义这取决于你的结构。也许设置带有用户 ID 的卡片并从用户卡 1 开始,并为用户拥有的每张卡增加 +1。您可以计数($_COOKIE['user_id']) 并从计数结果中逐步增加卡号,或者如果足够的话,只需在没有用户标识的情况下对它们进行编号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 2012-02-20
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    相关资源
    最近更新 更多