PHP - 用于使产品 ID 持久化的会话


PHP - Session for making product id persistent?

我正在用php和mysql创建一个产品数据库/站点。我已经开始使用会话变量来存储我当前的记录 ID,以便以后在将来的页面上引用。随着我走得更远,我突然意识到这可能不是理想的方法,因为当我想显示指向不同产品的链接时,我没有一种简单的方法将会话变量更新为新 id。

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

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

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

一点也不。 虽然您可能只有一个"产品.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请求并不意味着状态,请求本身应该携带所请求的信息。

拥有一个

"干净的网址"是没有用的,因为那样你的产品就不能被谷歌等搜索引擎索引。您应该始终为每个产品拥有自己的URL。您可以制作像/category/Product 这样的"语音 URL",并使用 URL 重写对其进行翻译。会话变量更适合用于持久的东西,如登录数据。

我以为会话变量 是这类事情的首选方法,我正在尝试 具有干净的网址字符串

永远不要将会话变量用于此类问题!

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

比方说,您的产品 URL 如下所示:

www.abc.com/product/bmw-q7

并且此产品的 id 是 73 保存在会话中,因此用户是否想为您的 URL 添加书签? 后来他点击了书签链接,此时,NEW 开始的会话中没有保存 ID。

因此,首选方法是在URL中附加id:

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

或者如果你使用 htaccess-mode-rewrite,则更好:

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