$_SESSION 变量没有保存在托管服务器上,但可以在我的本地主机上完美运行

Posted

技术标签:

【中文标题】$_SESSION 变量没有保存在托管服务器上,但可以在我的本地主机上完美运行【英文标题】:$_SESSION variables aren't saving on hosted server, but work perfectly and as expected on my localhost 【发布时间】:2015-06-09 01:54:55 【问题描述】:

所以更多细节..

我正在创建一个包含一系列页面的网站,每个后续页面都使用之前页面发布的信息设置不同的$_SESSION 变量。第一个页面之后的每个页面都设置一个不同的 $_SESSION 变量,该变量在该页面上用于查询数据库以了解要呈现的信息。然后再经过 3 页左右,所有这些不同的 $_SESSION 变量一起用于查询数据库以获取匹配的记录。

我的问题是,在每个后续页面上,$_SESSION 变量都将设置得非常好,但是当我进入下一页时,之前的相同 $_SESSION 变量现在将设置为 null..

真正让我感到困惑的是,这只发生在我正在使用的托管服务器上。该站点在我的本地主机上按预期工作(如果重要,我使用 wampserver),并且两者的代码完全相同。

第 1 页

这是在页面的顶部。我将“unset()”放在那里以清空网站开头的数据。

<?php
    session_start();
    unset($_SESSION['brand']);
    unset($_SESSION['model']);
    unset($_SESSION['carrier']);
    unset($_SESSION['size']);
?>

帖子靠近页面中间

<div id="select">
    <a href="models/page2.php?brand=a" onclick="post"><img src="images/a.png" id="a"/></a>
    <a href="models/page2.php?brand=b" onclick="post"><img src="images/b.png" id="b"/></a>
</div>

第 2 页

这是在页面的顶部

<?php

    session_start();
    if(isset($_SESSION['brand']))
    
        $brand = $_SESSION['brand'];
    
    else
    
        $_SESSION['brand'] = $_GET['brand'];
        $brand = $_SESSION['brand'];
    


    include('../connection/localconnection.php');

    $query = "SELECT DISTINCT Model FROM models WHERE brand = '$brand'";
    $result = $dbc->query($query);

    if(!$result)
        echo "DB error. Could not query database\n";
        echo 'mysql error: ' . mysql_error();
        exit;
    
?>

这篇文章在页面中间。我还 echo $_SESSION['brand'] 以确保它仍然设置。

<form action="../options/page3.php" method="post">
    <?php 
        if (mysqli_num_rows($result) > 0) 
            while ($row = mysqli_fetch_assoc($result))
            
                echo "<input type=\"submit\" id=\"c\" name=\"model\" value=\"$row['Model']\"/>";
            
         else 

            echo "Query didn't return any result";

                       
    echo $_SESSION['brand'];
    ?>
</form> 

这在服务器上工作得非常好,我会看到 $_SESSION['brand'] 完全按照它的预期设置。

但是,在page3.php 的底部,我再次将echo $_SESSION['brand'] 设置为null,所以我知道$_SESSION 变量仍然存在,它只是空的,对吗?

每个页面都发生这种情况,我不明白为什么。我不是最擅长 php 的人,但我理解的数量可观,我完全不明白为什么这只会发生在我的托管服务器上而不是我的本地主机上。任何帮助将不胜感激。

【问题讨论】:

可能是托管服务器上的 php.ini。您可能需要在代码中使用SID 才能使其正常工作。在此处查看文档:php.net/manual/en/session.constants.php 第 2 页上的 session_statt 可以中断吗? 【参考方案1】:

只是一个建议。根据 MVC 模式,会话应该在 Controller 中处理。您在 View 中处理它并且您的 View 包含太多 PHP 代码。

【讨论】:

【参考方案2】:

您的页面可能会出现会话问题,因为您在浏览器中打开的 URL 不是唯一的。例如,假设您正在为您的网站创建登录页面,并且您已成功创建会话。现在,如果您从 URL 登录说http://example.com,那么您的会话仅限于此 URL。如果您再次打开上面的 URL,如 http://www.example.com(注意两个 URL 中的 www.),那么您将看到您没有登录。所以请确保您的网页始终以单一类型的 URL 打开。尽管两个 URL 都将重定向到同一个目标,但请使用 URL 和 www。或不带 www。 还要确保包括

<?php
    session_start();
?>

作为每个 php 页面中的第一条语句。更多信息请查看post

【讨论】:

只要确保您用于访问网页的 URL 具有唯一前缀即可。

以上是关于$_SESSION 变量没有保存在托管服务器上,但可以在我的本地主机上完美运行的主要内容,如果未能解决你的问题,请参考以下文章

PHP 会话数据未保存

session文件无法并发操作

如何将 $_SESSION 变量传递给 websocket 服务器?

如何将会话值分配给变量

PHP $_SESSION 变量不持有

调试器在核心数据保存时停止,但没有错误输出