【问题标题】:PHP sessions and session_start()PHP 会话和 session_start()
【发布时间】:2012-08-01 23:44:56
【问题描述】:

对不起,如果这是一个愚蠢的问题,但最近我一直在为客户设计一个网站,但我的会话发生了一些奇怪的事情。

该网站有一个 PayPal 按钮,可将用户重定向到 PayPal,以便他们在再次重定向到该网站之前确认付款。

在用户被重定向之前,会保存大量会话变量。其中一些与 PayPal 有关,另一些与我网站上的内容有关,例如用于确定登录的用户、他们的购物车项目等的变量。

现在,这里出了问题...

用户从 checkout.php 重定向到 PayPal。在它们被重定向之前,站点的所有会话变量都存在(由 var_dump 和 print_r 显示)。这可以。

用户从 PayPal 返回 orderreview.php,但 var_dump 和 print_r 现在显示站点会话变量丢失,但所有 PayPal 变量都在那里。

我通过删除“session_start();”解决了这个问题从 orderreview.php 的顶部开始。

所以我的问题是,为什么删除该行可以解决问题?为什么以前不行?

我以为我了解 PHP 会话,但显然我并不像我想的那样了解它们。

我会在某处读到这个:

“从 PHP 4.3.3 开始,在会话已经启动时调用 session_start() 将导致 E_NOTICE 级别的错误。此外,第二次会话启动将被简单地忽略。”

所以我假设在脚本顶部调用 session_start 不会影响任何会话,如果会话已经更早启动。

感谢您的任何回答,如果这是一个愚蠢的问题,我再次道歉。

【问题讨论】:

  • orderreview.php 是它自己的文件还是包含在其他可能已经调用过session_start() 的文件中?
  • 这是它自己的文件,有一个从 PayPal 直接到 mysiteURL/orderreview.php 的重定向
  • 好吧,很奇怪,如果没有 session_start,我根本看不到您如何获得任何会话数据,它不应该可用。 var_dump(session_id()); 显示什么?如果没有会话开始,它应该是一个空字符串。我唯一能想到的可能是session.auto_start设置启用了?

标签: php session


【解决方案1】:

这可能是因为您在此过程中被重定向到另一个站点。当您从 Paypal 返回您的网站时,session_start() 生成了一个新的会话 ID,您之前存储的会话变量未链接到该 ID。

当你删除session_start()(我认为没有这个在上面的会话应该工作),它使用旧的会话ID并且永远不会重新生成。因此,旧的会话数据又回来了!

这只是我的假设。

【讨论】:

  • 问题是,代码在顶部没有 session_start() 的情况下可以完美运行,但就像你说的那样,我不认为会话应该在没有那行的情况下工作......所以我不是确定是否要保持这样的状态?这似乎有点不安全......但我不知道还能做什么
  • 没有启动会话就无法工作,可能是您在某个配置文件中启动它并将其包含在顶部?
  • 好吧,进一步审查,原来我在 orderreview.php 的顶部包含一个脚本,该脚本的顶部包含一个脚本,称为 session_start() (因此会话是工作正常)。然而,这仍然意味着在 orderreview.php 顶部有 session_start() 会导致问题(对这个理论进行了相当广泛的测试,这是唯一导致它的原因)所以我仍然很难理解为什么会这样: /
  • 所以你有两次session_start()。只需在两个会话开始后回显会话 ID。您将了解他们是获得相同的会话还是不同的会话。如果相同,则无需担心,如果不同,则旧会话变量将不起作用。
  • 我注意到另一个问题:用户从网站购买了东西,假设他们的 sessionID 是“ID1” 用户从网站购买了东西后,他们关闭了浏览器窗口。他们再次打开它并返回该站点,因为他们忘记订购某种产品。他们的会话 ID 现在不同了(我们称之为 ID2)。用户被重定向到 PayPal,他们确认一切,被重定向到 orderreview.php,但现在他们的会话 ID 又回到了 ID1,因此导致了一些问题。知道为什么会这样吗?
猜你喜欢
  • 1970-01-01
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2016-05-04
  • 2017-05-20
  • 2021-01-06
相关资源
最近更新 更多