【问题标题】:How to use cookies with arrays and ajax?如何将 cookie 与数组和 ajax 一起使用?
【发布时间】:2018-06-13 02:17:55
【问题描述】:

我正在尝试为我的(电子商务)网站制作一个购物车系统,但我不知道我做错了什么。当用户单击按钮时,我想显示 cookie 中的一些元素。对于按钮,我使用了一些简单的 HTML:

<button onclick="test()">CLICK ME</button>

我附加到函数的javascript是这样的:

var httpRequest = new XMLHttpRequest();
    function test() {
         if (!httpRequest) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        httpRequest.onreadystatechange = alertContents;
        httpRequest.open('GET', 'test.php?q=<?php echo $row['denumire'];?>', true);
        httpRequest.send();
    }
    function alertContents() {
        if (httpRequest.readyState === XMLHttpRequest.DONE) {
            if (httpRequest.status === 200) {
                document.getElementById('test_adaugare_produs_cos').innerHTML = this.responseText;
            } else {
                alert('There was a problem with the request.');
            }
        }
    }

由于我处于测试阶段,我只想在页面中输出 cookie 的元素。如果我有这个工作,我的项目的其余部分很简单。文件 test.php 包含以下代码:

$cookie = $_COOKIE['cos'];
$produse = array("$cookie");
$q = $_GET['q'];
array_push($produse, "$q");
$produse = json_encode($produse);
setcookie("cos",$produse,time()+2592000);
$cookie = json_decode($_COOKIE['cos'], true);
foreach ( $cookie as $cook) {
    echo $cook;
    echo "<br>";
}

代码有点工作。它输出数组的最后一个元素,但其余元素(只是网站上的产品名称,因为按钮应该使用 cookie 将元素添加到购物车中)采用字符串格式。这是它的样子(点击不同的产品后):

    ["[\"[\\\"[\\\\\\\"[\\\\\\\\\\\\\\\"[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"ABRAZIV PRO 115*50\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/100\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/ ML\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"]\\\\\\\\\\\\\\\",\\\\\\\\\\\\\\\"ABRAZIV PRO 115*50\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/100\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\/ ML\\\\\\\\\\\\\\\"]\\\\\\\",\\\\\\\"ACTUATOR MTR TECH2230\\\\\\\"]\\\",\\\"ACTUATOR MTR TECH2230\\\"]\",\"ACTUATOR MTR TECH2230\"]","ACCESORII SINA PLASTIC DUBLA 3M"]
ACCESORII SINA PLASTIC DUBLA 2.5M

产品名称如下(我包括它们是因为它们不是英文的,我不想造成混淆):

  • ABRAZIV PRO 115*50/100/ML
  • 执行器 MTR TECH2230
  • ACCESSORII SINA PLASTIC DUBLA 3M
  • ACCESSORII SINA PLASTIC DUBLA 2.5M

我曾尝试使用 cookie 中的数组来做这种事情,并且只是将产品名称添加到数组中,但事实证明这很麻烦。会有更好的方法吗?我该如何解决这个问题?

感谢您的回答!

【问题讨论】:

  • 您为什么要使用 Ajax 调用设置 cookie 而不仅仅是在 Ajax 响应中返回数据?您是否尝试在客户端读取 cookie?我在代码中没有看到这种尝试。
  • 我认为使用 PHP 会更容易,因为我更熟悉它。当我稍后尝试使用产品名称在数据库中搜索其他产品信息时(在购物车中使用它时),它也可能会派上用场。我可能弄错了,因为我只是一个菜鸟

标签: javascript php ajax cookies


【解决方案1】:

$_COOKIE['cos'] 似乎是 JSON 编码的。但是当你初始化$produse 时,你不会解码它,你只是用编码的字符串初始化它。因此,该数组具有单个元素,该元素已被编码。然后你添加另一个元素,然后重新编码整个东西。这就是为什么你每次都会得到越来越多的斜线。

试试这个:

$cookie = !empty($_COOKIE['cos']) ? json_decode($_COOKIE['cos'], true) : [];
$q = $_GET['q'];
array_push($cookie, $q);
$produse = json_encode($cookie);
setcookie('cos',$produse,time()+2592000);
foreach ($cookie as $cook) {
    echo $cook;
    echo "<br>";
}

请注意,当推入数组时,我已经从 $q 周围删除了双引号;它们不是必需的,因为 $q 已经是一个字符串。

如果你想消除一些中间变量,你可以这样做:

$cookie = !empty($_COOKIE['cos']) ? json_decode($_COOKIE['cos'], true) : [];
array_push($cookie, $_GET['q']); // Alternately, $cookie[] = $_GET['q'];
setcookie('cos', json_encode($cookie), time()+2592000);
foreach ($cookie as $cook) {
    echo $cook;
    echo "<br>";
}

【讨论】:

  • 感谢您的回答,但您的解决方案不起作用。我已经复制粘贴了代码,它给了我这个错误:array_push() expects parameter 1 to be array, null given。这就是我使用 $produse 数组的原因,因为 $_COOKIE 不能像 $_SESSION 那样使用(至少从我读到的)。
  • 在这段代码开始之前$_COOKIE['cos'] 是什么样子的?
  • 我已经编辑了我的答案以处理 $_COOKIE['cos'] 尚未设置的情况,例如代码第一次运行。
  • 好吧,当我运行您的代码时,我重置了我的 cookie 以查看在这种情况下会发生什么。您更新的代码在这两种情况下都运行,我非常感谢您。 +1
猜你喜欢
  • 2011-09-03
  • 2013-07-12
  • 2016-11-14
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2018-07-05
相关资源
最近更新 更多