在Cookie中设置购物车会话

时间:2014-03-07 14:59:37

标签: php session cookies web-storage

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

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

我想将整个事情设置为cookie。请帮忙。 我想知道如果我在这里使用网络存储而不是cookie,有什么好处......

谢谢..

3 个答案:

答案 0 :(得分:3)

使用用户浏览器的任何人都可以访问

Cookies,最好的办法是将购物车会话存储在数据库中,并且只将该数据库条目的行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. Cookie为每个域提供4096字节的限制
  3. 更多资源:

    1. http://davidwalsh.name/php-cookies
    2. http://in3.php.net/setcookie
    3. Local Storage vs Cookies
    4. Keep $_SESSION alive with autorenewing counter

答案 1 :(得分: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>';
}

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

答案 2 :(得分:0)

正如约书亚所指出的,饼干并不是存放购物车信息的最佳地点。这类信息应保存在服务器上。根据您的要求,可以是会话数据或数据库。在客户端存储购物车信息不允许任何洞察购物车内容。例如,如果有人在购物车中留下商品,您可以通过发送提醒或向商店页面添加消息来吸引他们。

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

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