3

我正在创建一个购物车,我只是使用会话来更新购物车。但我想将其设置为 cookie 并检索它以供进一步使用......我的购物车会话是:

$_SESSION['cart'][$pid] = array("item_id" => $pid, "quantity" => $tobesend, "price" => $price_per_q);

我想把这整件事设置成cookie。请帮忙。而且我想知道如果我在这里使用网络存储而不是cookie有什么好处......

谢谢你..

4

3 回答 3

3

任何使用用户浏览器的人都可以访问cookie,最好的办法是将购物车会话存储在数据库中,并且只将数据库条目的行 ID 存储在 cookie 中。所以基本上:

// Store the data in the database, in whatever form you choose
$id = last_insert_id(); // Get the ID of the row in which this information is stored

// Store the id in a cookie
setcookie("cart_session_data_id", $id, time() + 3600 * 24);  /* expire in 1 day */

现在,您可以在需要时将数据库中的数据检索回会话中

// Get the row id from the cookie
$id = $_COOKIE['cart_session_data_id'];

// Use this ID and retrieve the data from the database

为什么选择网络存储而不是 cookie?

  1. 将敏感数据存储在 cookie 中是不明智的,因为 XSS 攻击可以获取所有 cookie
  2. Cookies 为您提供每个域 4096 字节的限制

更多资源:

  1. http://davidwalsh.name/php-cookies
  2. http://in3.php.net/setcookie
  3. 本地存储与 Cookie
  4. 使用自动更新计数器保持 $_SESSION 存活
于 2014-03-07T15:07:22.740 回答
1

正如@Joshua Kissoon 提到的,cookie 只能用于非敏感信息和少量数据。如果您需要使用 cookie,您可以将数据设置在数组中并对其进行序列化:

$cart = array($pid => array("item_id" => $pid, "quantity" => $tobesend, "price" => $price_per_q));
setcookie("cart", serialize($cart));

检查它然后访问它:

if (!empty($_COOKIE) && isset($_COOKIE['cart'])) {
    $cart = unserialize($_COOKIE['cart']);
    echo '<pre>';print_r($cart);echo '</pre>';
}

我只会将其用于不重要的数据。

于 2014-03-07T15:18:16.400 回答
0

正如 Joshua 所指出的,cookie 并不是存储购物车信息的最佳场所。此类信息应保存在服务器上。根据您的要求,这可能是会话数据或数据库。在客户端上存储购物车信息不允许对购物车内容有任何了解。例如,如果有人将商品留在购物车中,您可以通过发送提醒或向店面页面添加消息来吸引他们。

要回答您的问题,cookie 是字符串,因此如果您想将购物车数据结构存储为 cookie,则需要对其进行序列化。有关和的技术优点的讨论,请参阅前面的问题serializejson_encode

“网络存储”一词有点含糊。您指的是 HTML5 本地存储吗?如果是这样,那可能不是一个好的选择,因为数据不会像 cookie 那样在每个请求上自动发送到服务器。

于 2014-03-07T15:27:49.127 回答