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

时间:2015-03-15 23:58:02

标签: php mysql session get

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

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

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

3 个答案:

答案 0 :(得分:2)

拥有“干净的网址”没有用,因为那时您的产品无法被谷歌等搜索引擎编入索引。 每个产品都应该有自己的网址。 你可以像/ category / product那样制作“说话的网址”,并用网址重写进行翻译。 会话变量更适用于登录数据等持久性事物。

答案 1 :(得分:2)

  

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

完全没有。虽然您可能只有一个“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 :(得分:1)

  

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

永远不会对此类问题使用sessionVariables!

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

假设您的产品网址如下:

www.abc.com/product/bmw-q7

并且此产品的ID已保存在会话中,因此用户想要为您的网址添加书签?然后他点击了已添加书签的链接,此时,新启动的会话中没有保存ID。

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

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

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

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