【问题标题】:PHP Session not working in sub directoriesPHP Session 在子目录中不起作用
【发布时间】:2015-06-26 19:28:50
【问题描述】:

我面临这个奇怪的问题。我有一个 PHP 页面,我在其中设置了会话变量。然后我使用 $('').load(URL); 将另一个页面加载到此页面的 DIV 标记中;但是正在加载的页面不保留会话并在加载后立即销毁当前页面。但是,如果会话与主页面保持在同一目录中,则同一页面会保留会话。

我看到了一个类似的问题here。但它没有提供任何解决方案。

这是我的代码 主页:sample.php

<?php
session_start();
echo session_id();
echo "<br>";
$_SESSION['test'] = "hello";
var_dump($_SESSION);
echo "<br>";
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        echo $_SESSION["test"];
        ?>
        <div id="samedir" style="border: 1px solid #000;">

        </div>
        <br>
        <div id="subdir" style="border: 1px solid #000;">

        </div>
        <input type="button" value="hello" id="hellobtn"/>
        <script type="text/javascript" src="js/jquery-1.11.0.js"></script>
        <script>
            $('#hellobtn').click(function() {
                $('#samedir').load("sample1.php");
                $('#subdir').load("forms/sample1.php");
            });
        </script>
    </body>
</html>

第二页:sample1.php

<?php
ob_start();
if(!isset($_SESSION)) 
    session_start();
echo session_id();
echo "<br>";
var_dump($_SESSION);
ob_flush();
?>

您可以在这里看到我在主页中有 2 个加载调用 $('#samedir').load("sample1.php"); 这个从同一目录加载并转储输出

array(1) { ["test"]=> string(5) "hello" } 

而第二个电话 $('#subdir').load("forms/sample1.php"); 转储了这个:

array(0) { } 

但是在我的本地主机 (MAMP) 中一切正常,但在我的托管服务器中却不行。 谢谢各位。

【问题讨论】:

  • 如果您只在 sample1.php 上执行 if 语句 + echo $_session['test'] 会怎样?
  • php 开头标签前的一些空格/换行符?您应该启用错误显示并检查session_start() 的返回值。另外,您的输出似乎与脚本不匹配,会话 ID 在哪里?
  • sample1.php : session_start(); 在任何条件下.. 不仅是if(!isset($_SESSION)) ..
  • @jeroen 嗨,我在此处粘贴时没有复制会话 ID。但它符合预期。 sample.php: b1646cb8ab5190c1c55dc42a4b83f76e array(1) { ["test"]=> string(5) "hello" } hello b1646cb8ab5190c1c55dc42a4b83f76e array(1) { ["test"]=> string(5) "hello" } b1646cb8ab5190c1c5dc 0) { }
  • @SyedQarib 嗨,我在签入另一个 stackoverflow 页面后遇到了这种情况。无论我是否使用条件,它都会给出相同的结果。

标签: javascript php jquery html session


【解决方案1】:

在您的第二页中, 您必须在第二行开始会话 没有任何条件。

【讨论】:

    【解决方案2】:

    会话在服务器上的临时目录中创建一个文件,其中存储了已注册的会话变量及其值。在访问期间,该数据将可供网站上的所有页面使用。

    临时文件的位置由 php.ini 文件中名为 session.save_path 的设置决定。所以请检查这条路径。

    还有 [session-save-path()][1] 获取和/或设置当前会话保存路径。

    我认为你不需要写这一行并检查你的 php.ini 是否有正确的路径。

    对于会话我发现了一些有用的文章http://www.tutorialspoint.com/php/php_sessions.htm

    该目录不会影响您的会话状态(给定 Apache-PHP 网站的所有目录将在标准配置中访问相同的会话)。您不应该使用 session_save_path()。

    我认为问题的部分原因在于您将 'uid' 设置为自身 ($_SESSION['uid'] = $_SESSION['uid'];) - 因此可能永远不会真正将其设置为一个值 - 并且如果未设置,可能会无限期重定向。

    我建议进行这个简单的测试,以确保您的会话确实有效:

    /session_set.php

    <?php
        session_start();
        $_SESSION['uid'] = 123;
    

    /sub_dir/session_get.php

    <?php
        session_start();
        echo $_SESSION['uid'];
    

    【讨论】:

    • 嗨@Write 感谢您的解释。但请检查上面的代码。我没有使用过类似的东西 $_SESSION['uid'] = $_SESSION['uid'];在 sample.php 页面中我设置了 $_SESSION['test'] = "hello";在 sample1.php 页面中,我得到了 echo $_SESSION['test'];会话开始后。
    猜你喜欢
    • 2017-10-10
    • 2016-10-03
    • 1970-01-01
    • 2011-10-13
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多