【问题标题】:$_SESSION, PHP, iframe, not getting the SESSION variables$_SESSION,PHP,iframe,未获取 SESSION 变量
【发布时间】:2013-07-26 09:45:01
【问题描述】:

我正在创建一个非常简单的基于 PHP 的仓储程序,但后端过程相当复杂。

所以情况如下:

  1. 我有一个登录页面,它指向授权页面,它第一次设置session_namesession_start() 并设置会话变量。

  2. 在授权页面之后,它转到 main.php 页面,该页面是一个左侧的菜单(链接)表,我也做了session_name()

  3. 主页右侧是用户点击左侧链接时显示页面的 iframe。我还做了session_name()

问题:

main.php 没问题,它可以完美地读取会话变量,但 iframe 无法获取会话变量(我尝试 print_r($_SESSION),结果为空)。我试过var_dump(session_name("abc")),其中“abc”是我在(1)中使用的会话名称,它确实显示“abc”,尝试过(isset($_SESSION))并返回真......所以我不知道是什么我做错了...


编辑: 对不起,伙计们,我想我可能找到了罪魁祸首……这是我这边的一个逻辑错误……我有这个条件来检查我创建的每个 php 页面,以在用户级别无权使用时破坏会话当前页面。我的坏..非常感谢你们的帮助!!

【问题讨论】:

  • 我必须补充一点,它之前没有问题,但是这个问题只是在 2 晚前突然出现..

标签: php session iframe


【解决方案1】:

确保session_start() 在所有页面上:

session_start() 根据通过 GET 或 POST 请求或通过 cookie 传递的会话标识符创建会话或恢复当前会话

PHP manual reference

要控制 $_SESSION 的内容,请尝试在所有 ireame 页面中放入代码:

<?php 
   session_start();

   echo '<pre>';
   var_dump($_SESSION);
   echo '</pre>';

【讨论】:

  • 是的,我做到了。 session_start 在 main.php 中,假设调用 main.php 时,iframe 中的第一页是 a.php,我确实放了 session_name() 和 session_start()
  • @TimothyTrisnadhama 尝试将代码放在所有页面中,您将知道 $_SESSION 丢失了什么。
  • 是的,我找到了罪魁祸首……当我的 if 语句逻辑有点缺陷时,删除会话绝对是我的错……哈哈……感谢您指出“$_SESSION 迷路了。 "
【解决方案2】:

您是否在 iframe 和 main.php 的页面顶部都使用了 session_start()? 您还需要将 session_start() 放在 iframe 的顶部。

【讨论】:

  • @trunks75 是的,我做到了。 session_start 在 main.php 中,假设调用 main.php 时,iframe 中的第一页是 a.php,我确实放了 session_name() 和 session_start()
【解决方案3】:

这可能会解决您的问题:php session & iframe

另外:如果您使用 iframe 来显示您网站的大部分内容,那么没有什么是简单的。您可能要考虑不使用它们。

【讨论】:

  • 不,我试过了.. 我正在使用 chrome/ff.. 仍然没有运气:(
【解决方案4】:

我的一个 PHP 网页上的多个 iframe 遇到了同样的问题。

在我的例子中,当页面使用http://example.com 加载时,一些对 PHP 端点的 AJAX 调用被发送到 www.example.com。如果您与域路径不一致,您可能会遇到会话问题,因为从技术上讲,来自 www.example.com 的请求来自子域,而不是直接来自 http://example.com。在 JavaScript 中进行 AJAX 调用时,您可以通过始终使用基于 PHP 的 API 的相对路径来完全避免这个问题。

我通过在 Chrome 中检查我的 cookie 发现了这种情况。我注意到两个不同的 cookie,其中有不同的 PHP 会话 ID。一个是为 www.example.com 设置的,而另一个是为 example.com 设置的

正如在其他一些答案中提到的,您始终可以使用以下方法将会话 cookie 域设置为在您的所有子域以及您的主站点上工作:

ini_set("session.cookie_domain", ".domain.com");

默认情况下,PHP 将为每个域/子域设置一个新会话。希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 2020-09-04
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多