【问题标题】:Session not saving for whole site会话未保存整个站点
【发布时间】:2014-10-10 10:16:42
【问题描述】:

我在 php 会话函数方面遇到了一个非常奇怪的问题。

首先:它只适用于某些浏览器。就像随机选择的那样:Windows 上的 FF,但 Mac 上的 FF,两个平台上的 Chrome,Safari 不工作,但 IE 可以。

我有一个登录脚本,如果登录数据正确,我会在其中创建一个会话:

session_start();
$_SESSION['username'] = $user_info['username'];

echo "<pre>";
print_r($_SESSION);
echo "</pre>";

当我在登录脚本中执行 print_r 时,设置会话变量后,它适用于所有浏览器。但是在将用户重定向到主站点后,会话对于某些浏览器来说是空的......

我从来没有遇到过这样的问题,我真的不知道该怎么办......

【问题讨论】:

  • 当您说“将用户重定向到主站点”时,这是一个不同的站点吗?你如何重定向它们?
  • 您的要求并不完全清楚。您是否以session_start(); 开头每一页?
  • 是的,我当然愿意。而且它是同一个域和同一个服务器,甚至不是子域,很抱歉没有澄清这一点。
  • 一个调试问题 - 登录页面上的session_id() 是否在其他页面上为您提供相同的 ID?
  • 这个数组的数据是从哪里来的,$user_info['username'];。你需要先定义这个

标签: php html apache session


【解决方案1】:
session_start();
$_SESSION['username'] = $user_info['username'];

echo "<pre>";
print_r($_SESSION);
echo "</pre>";

如果这是每个页面的开始,我可以理解你在刷新后看不到任何东西,原因很简单,你所做的是你开始你的会话,你将 $_SESSION 变量用户名设置为 $User_info 变量用户名。而且你每次都这样做。

但请考虑一下:此时根本没有指定您的变量。也许您在登录时设置了它,但是,您在下次刷新时将其清除,因为您告诉它再次使用 $user_info['username']。在这种情况下,没有预先调用任何东西,它将是一个空变量。因此,您的用户名将是空白的。

您的会话['username'] 也将是空白的,因为您告诉它获取该信息。

由于你是在登录的时候设置的,所以不需要重新指定,因为你的session['username']已经设置好了

编辑

所以我现在问,你把什么放到你的数据库中?您是否将 SessionId 保存在数据库中?因为那么你可以做这样的事情。

session_start();

$Session=session_id();  
$result1 = LoadSessionData($Session);
$count=mysqli_num_rows($result1);
if($count=="0"){
    $Time=time();
    $Ip = $_SERVER['REMOTE_ADDR'];
    StartSessionData($Session,$Time,$Ip);
    $_SESSION['Username'] = '';
}else{
    while ($row1 = mysqli_fetch_array($result1)){       
        $UserName = $row1['GebruikerNaam'];
        if ($UserName == ""){
            $_SESSION['Username'] = '';
        }
        $Time=time();
        $Time_check=$Time-3600;
        $Ip = $_SERVER['REMOTE_ADDR'];
        OnlineChecker($Session,$UserName,$Time,$Ip);
    }
}

我希望你能关注它,但我会尽力解释。它检查 sessionId 是否在数据库中,如果没有,将数据库中的 session id 与时间戳、ip 和 session 用户名一起添加,设置为空白。

否则,我会检查我返回的内容,如果它有用户名,请使用该用户名。如果它为空,则 sessionusername 将保持空白,因为如果我已登录,它将稍后使用该用户名进行检查。然后我使用用户名、时间等更新数据库。

【讨论】:

  • 我只是在登录脚本中使用该代码。在任何其他网站上,我只使用 print_r 看看它是否有效
  • 你能发布你如何开始每一页吗?因为你的错误可能在那里。从技术上讲,您现在向我们展示了工作代码:)
  • 基本上就是 session_start();在每一页上。我没有在数据库中保存任何与会话相关的内容。如果会话过期,用户必须重新登录。
猜你喜欢
  • 1970-01-01
  • 2012-09-06
  • 2017-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多