【问题标题】:PHP - Session for making product id persistent?PHP - 使产品ID持久化的会话?
【发布时间】:2015-03-15 23:58:02
【问题描述】:

我正在使用 php 和 mysql 创建一个产品数据库/站点。我已经开始使用会话变量来存储我当前的记录 id 以供以后在以后的页面上参考。随着我进一步了解,这可能不是理想的方法,因为当我想显示指向不同产品的链接时,我没有简单的方法将会话变量更新为新的 id .

想象一下,如果您在产品 id 73 的产品页面上。会话变量将是 $_SESSION['id'] = 73。现在您在系统中执行搜索并找到您想要的新产品看法。您单击该链接并被重定向到“产品页面”,该页面期望访问会话变量以了解要显示的产品,但此时该变量仍设置为 73。

是使此过程与 GET 一起工作并将我的变量附加到 url 字符串的唯一/最佳方法吗?对于这种情况,推荐的流程是什么?我试图避免使用 GET,因为我认为会话变量是此类事情的首选方法,并且我试图拥有一个干净的 URL 字符串。

【问题讨论】:

  • 没有理由为此使用 GET。为什么你说“我想显示一个指向不同产品的链接,我没有简单的方法来将会话变量更新为新的 id。”为什么不?你说$_SESSION['id'] = $newid
  • @Unipartisandev:如果一个特定页面有一个指向不同产品的链接列表怎么办。这些链接将如何工作?
  • @Unipartisandev :大卫的评论是确切的问题。如果我有多个链接的搜索结果,我无法重置会话变量,直到我点击另一个页面。是的,然后我可以在登陆产品页面时设置会话,但为了这样做,我仍然必须首先传递 URL 字符串中的信息。所以,在我看来,即使在那个时候使用 session 变量也没有意义。
  • 我说做对你有用的事。

标签: php mysql session get


【解决方案1】:

我认为会话变量是这类事情的首选方法

一点也不。虽然您可能有一个“product.php”页面来简化和重用代码,但您没有一个“产品”资源。任何查看给定产品详细信息的请求都是对不同资源的请求。根据 HTTP 标准,该请求的 URL 应该不同,以便 URL 可以识别该资源。

在大多数情况下,最终看起来像这样:

product.php?id=123

因此,您可以想象任何独特的产品都会通过使用数字标识符产生一个独特的 URL。然而,这并不是唯一的方法。

我试图有一个干净的 URL 字符串

你仍然可以。有很多方法可以做到这一点。例如,许多现代 Web 框架可能能够从请求 URL 的格式中获取标识符。所以你也许可以使用这样的东西:

products/123

这看起来更加 RESTful,因为它将标识符维护为 URL 的一部分,而不是附加到 URL 的值。此外,它将资源的products 组件复数化,这更准确地表明人们正在从集合(产品)中请求项目(123)。

根据您使用的框架或工具,您还可以使用命名标识符。所以 URL 可能看起来像这样:

products/my-awesome-product

如果任何给定产品都有唯一的上下文名称,而不是唯一的数字系统标识符(或者可能是除了唯一的数字系统标识符之外),这将起作用。


关键是,使用会话状态进行简单的资源导航绝对是不是首选方法。正如您现在发现的那样,它很快就会成为一个问题。会话变量的使用引入了对服务器端状态的依赖。 HTTP 在设计上是无状态的。 GET 请求不暗示状态,请求本身应携带所请求内容的信息。

【讨论】:

  • 感谢您抽出宝贵时间如此彻底地回答。我不确定我从哪里得到会话变量是更好方法的想法,但正如你所说,显然我自己发现事实并非如此,你已经很好地解释了它。
【解决方案2】:

拥有一个“干净的 url”是没有用的,因为这样您的产品就无法被 google 等搜索引擎索引。 您应该始终为每个产品拥有一个自己的网址。 您可以制作像 /category/product 这样的“说话 url”,并使用 url rewrite 进行翻译。 会话变量更适合用于登录数据等持久性内容。

【讨论】:

  • 我刚刚顿悟了。我以前从未想过关于 GET 的搜索引擎索引。
  • @cari :关于搜索引擎索引的好点,我也没有想到这一点。但是,在这种情况下,它是针对 Intranet 站点的,因此不适用,但绝对值得为将来的项目记住。
【解决方案3】:

我认为会话变量 是这类事情的首选方法,我试图 有一个干净的 URL 字符串

切勿将 sessionVariables 用于此类问题!

使用会话变量可能会遇到问题的示例:

可以说,您的产品网址如下所示:

www.abc.com/product/bmw-q7

并且该产品的 id 是 73 保存在会话中,所以用户想为您的网址添加书签?后来他点击了书签链接,此时,新开始的会话中没有保存任何id。

所以首选的方法是在 url 中附加 id:

www.abc.com/product/bmw-q7?id=73

如果你使用 htaccess-mode-rewrite 会更好:

www.abc.com/product/bmw-q7/73

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多