35

在没有用户名/登录名来保存购物车数据的电子商务网站上,使用 PHP $_SESSION 变量或浏览器 cookie 来保存购物车中的商品会更好吗?我倾向于 $_SESSION,因为 cookie 可以被禁用,但想听听你的想法。

预先感谢您的考虑。

4

6 回答 6

48

两者都不

没有大型网站敢将用户的购物车存储在会话或 cookie 中——这些数据非常有价值。

客户在购买什么,他们何时选择商品,购买了多少,为什么他们没有完成结账等等。对您的业务来说,这些都是非常非常重要的。

使用数据库表存储此信息,然后将其链接到用户的会话。这样您就不会丢失信息,并且可以返回并根据用户购物车构建统计数据或解决结帐过程中的问题。

尽可能记录一切。

数据库模式

下面是一个简化的示例,说明这可能会如何看待数据库级别。

user {
    id
    email
}

product {
    id
    name
    price
}

cart {
    id
    product_id
    user_id
    quantity
    timestamp    (when was it created?)
    expired      (is this cart still active?)
}

您可能还希望将购物车表拆分为更多表,以便跟踪对购物车的修订。

会话

正常的 PHP 会话由两部分组成

  1. 数据(存储在服务器上的文件中)
  2. 给用户代理(浏览器)的唯一标识符

因此,它不是$_SESSIONvs $_COOKIE- 它是$_SESSION + $_COOKIE =“会话”。但是,您可以通过使用包含数据的单个加密 cookie 来修改它(因此您不需要标识符来查找数据)。另一种常见的方法是将数据存储在 memcached 或数据库中而不是文件系统中,以便多个服务器可以访问它。

@Travesty3 的意思是你可以有两个cookie - 一个用于会话,另一个是“让我保持登录”cookie(存在时间比会话 cookie 长),或者是单独 cookie 中的数据副本.

于 2012-09-24T17:17:02.020 回答
9

正如 Xeoncross 所指出的,存储任何可能的信息以供分析是非常重要的。因此,不应完全依赖会话和 cookie。

一种可能的方法是-

未登录时使用会话

如果用户未登录,您可以使用$_SESSIONPHP 从会话中存储和检索购物车项目和愿望清单项目

登录时使用数据库

如果用户已登录,那么您可以考虑以下两个选项之一 -

  • 将购物车项目或愿望清单项目单独存储在数据库中
  • 将购物车项目或愿望清单项目存储在数据库以及会话中(这将保存一些数据库查询)

当用户登录时

当用户登录时,从会话中获取所有购物车项目和愿望清单项目并将其存储在数据库中。

这将使数据持久化,即使用户注销或更改机器但直到用户没有登录,都无法永久存储信息,因此不会持久化。

获取所需数据

每当您尝试访问购物车或愿望清单时,请执行以下检查 -

  • 如果用户未登录,则查看会话
  • 如果用户已登录,如果您单独存储在数据库中,则查询数据库,否则如果您保持会话与数据库一起更新,则可以只查看会话
于 2015-08-06T06:32:20.837 回答
7

我会把它存储在一个会话中。我的愿望清单很长,我担心它不会适合COOKIE可能占用的4K存储空间。它会强制您将会话超时设置为更长的时间。

注意:有些国家(比如我所在的荷兰)对 cookie 有非常严格的政策,您可能会被立法强制使用 Sessions。

于 2012-09-24T17:00:29.667 回答
4

一些帮助点:

饼干:

  • 信息会一直保留到 cookie 过期(您可以配置什么);
  • 倾向于减慢服务器和客户端之间的通信,因为它必须在每个请求/响应中在两者之间进行交换;
  • 它是一种不安全的数据存储形式,易于嗅探;
  • 他们也有存储数据的限制。

会议:

  • 所有信息都保存在服务器中,因此不与客户端交换。
  • 因为它不是在网络上共享的,所以它更安全一些;
  • 会话结束时所有信息都会丢失;
  • 如果您在共享主机中托管,则由于托管在同一服务器上的任何站点对资源的推送,您可能会遇到会话在操作中间结束的问题。

我个人会参加会议,因为我假设是一个中小型受众页面。如果它增长,您最好使用简单的数据库结构来存储这些数据,并制定维护计划来获取不必要的数据(例如:选择某些产品但不进行结帐的客户)。

于 2012-09-24T17:08:25.807 回答
3

您可以考虑同时使用两者。

缺点$_SESSION是当浏览器关闭时会话被清除。

使用会话,但尝试从 cookie 填充 $_SESSION 数据(如果可用)。

于 2012-09-24T17:16:32.537 回答
2

我会使用会话。如果用户禁用了 cookie,则会话将无法启动,因为会话 ID 存储在用户计算机上的 cookie 中。

您可能需要查看一些设置,以便尝试将会话保持更长时间。

  • session_set_cookie_params()通过使用lifetime参数集运行,防止在用户关闭浏览器时删除会话 cookie 。这个函数需要先运行session_start()

  • 您可能还希望通过修改session.gc_probability, session.gc_divisor, session.gc_maxlifetimephp.ini 中的会话垃圾收集设置或使用来扩展从服务器清除会话的频率ini_set()

  • 如果您在服务器上运行其他网站并且您修改了上述垃圾收集设置,您将需要在 php.ini 中设置它们以便它们适用于所有网站,或者如果您正在使用,ini_set()那么您可能还会考虑将这些会话保存到不同的通过修改目录比其他网站session_save_path()。这又是在之前运行的session_start()。这将防止其他网站的垃圾收集清除您对某个特定网站的扩展会话。

  • 我还建议在 php.ini 中设置以下会话设置session.entropy_file = /dev/urandom, session.entropy_length = 256, session.hash_function = sha512。这应该会为您提供一个加密的强会话 ID,并且冲突的可能性非常小。

  • 并确保您的站点上有 SSL 证书,以防止中间人攻击您的会话 ID。

显然,用户仍然可以决定手动清除他们的所有 cookie,这些 cookie 将带上会话 ID cookie,但这是我准备承担的风险。如果我在购物车系统中途没有结账,我就不会去清除我的 cookie。我仍然认为会话比仅使用普通 cookie 更好。

只要您是唯一可以访问您的会话目录并且您的会话 ID 很强大的网站,数据就足够安全。通过延长服务器的会话存储时间,您的数据可以保留在服务器上。

您可以采取进一步的措施来使您的会话更加强大。每 20 分钟重新生成一次会话 ID,复制数据。还要在数据库中根据 IP 地址记录会话 ID,并检查特定 IP 地址是否尝试在给定时间内发送超过 X 个会话 ID,以防止有人试图暴力破解会话 ID。

您还可以将数据存储在由会话 ID 链接的数据库中,而不是存储在服务器上的会话文件中。然而,这仍然依赖于存储在 cookie 中并且可能随时消失的会话 ID。真正确保用户不会丢失购物车的唯一方法是让他们先登录并存储在数据库中。

于 2012-09-24T17:14:04.923 回答