【问题标题】:Session information being lost会话信息丢失
【发布时间】:2012-03-13 18:21:50
【问题描述】:

我正在运行一个登录脚本,根据谁登录我重定向到两个页面之一

如果我指向位于主目录下方的目录中的页面一切正常,但是如果我指向位于 index.php 文件所在目录之上的页面,会话信息似乎会丢失并要求用户再次登录

我知道我可以简单地将第二页放在主目录下方的目录中,但我想了解在指向主目录上方的页面时是否可以维护会话信息

用户转到一个名为 login.html 的页面,当他们在那里输入信息时,他们被发送到 login.php,这是重定向发生的地方

if ($username==$dbusername&&$password==$dbpassoword)
{
    if($admin == "1"){
        header('location: http://www.edit.domain_name.co.uk/');
        $_SESSION['username']=$username;
        $_SESSION['id']=$id;

    }else{
        header('location: /member');
        $_SESSION['username']=$username;
        $_SESSION['id']=$id;
    }
}

我已将session_start (); 放在用户需要登录才能访问的每个页面的开头。任何意见都会受到极大的欢迎

登录脚本的完整代码是

<?php
session_start () ;

$username = $_POST['username'] ;
$password = $_POST['password'] ;

################# ADMIN OR NOT   ###################################################

include_once "mysql/global.php";
$result = mysql_query("SELECT admin FROM users WHERE username = '$username'");
if (!$result) {
    echo 'Could not run query: ' . mysql_error();
    exit;
}


$row = mysql_fetch_row($result);

$admin = $row[0];


################# ###############################################################

if ($username&&$password)
{

include "mysql/global.php";

$query = mysql_query("SELECT * FROM users WHERE username='$username'") ;

$numrows = mysql_num_rows($query) ;

if ($numrows!=0)
{

  while ($row = mysql_fetch_assoc($query) )
  {
      $dbusername = $row['username'] ;
      $dbpassoword = $row["password"] ;

  }

  // check to see if they match!
  if ($username==$dbusername&&$password==$dbpassoword)
  {
      if($admin == "1"){
          session_start();
          header('location: http://www.edit.domin_name.co.uk/admin');
          $_SESSION['username']=$username;
          $_SESSION['id']=$id;

      }else{
      session_start();
      header('location: /member');
      $_SESSION['username']=$username;
      $_SESSION['id']=$id;


      }
  }
  else 
      echo "<center>incorrect password!</center>" ;

}
else
    die ("<center>That user does not exist!</center>") ;


}
else
    echo ("<center>Please enter a username and password</center><br/>") ;
    die ("<a href=\"index.php\"><center><b>Click here to try again</b></center></font>");


    ?>

【问题讨论】:

  • 与您的问题无关,但您有很多事情要做:"SELECT admin FROM users WHERE username = '$username'"。您真的想使用准备好的语句或 mysql_real_escape_string。

标签: php


【解决方案1】:

为了加载会话,您必须将 session_start() 放在每个页面的顶部。

另外,您需要在设置它们和重定向之前调用 session_start():

if ($username == $dbusername && $password == $dbpassoword) {
    if($admin == "1"){
        session_start();
        $_SESSION['username']=$username;
        $_SESSION['id']=$id;
        header('Location: http://www.edit.domain_name.co.uk/');
    } 
    else {
        session_start();
        $_SESSION['username']=$username;
        $_SESSION['id']=$id;
        header('Location: /member');
    }
}

【讨论】:

  • 我已经把 session_start ();在用户需要登录才能访问的每个页面的开头,我还放置了 session_start ();在 login.php 的开头
  • 确保在每个 $_SESSION[?] = "" 之前放置 session_start() 并在设置会话之后放置 header() 函数。请参阅我的代码编辑。
  • 我已经用 login.php 的所有代码更新了我的问题
  • 哦,我认为“dbpassoword”是一个错字,并将其更改为“dbpassword”。我已经修好了。立即尝试。
【解决方案2】:

header('location: /member');

首先,这是无效的。 Location 标头后面应该跟一个完整的 URL,而不是相对的 URL。

其次,如果/member 是一个目录,并且您访问www.example.com/member,Apache 很可能会将您重定向到example.com/member/,添加正斜杠并删除www.。转移到不同的域名可能会导致会话数据丢失。

【讨论】:

  • Location: 标头不需要完整的 URL。我每天只用文件名使用它。此外,如果 htaccess 文件配置为删除 /member 之后的斜杠,则不会更改。
  • @BaileyMcAfee。 Location 标头 should take an absolute URI。浏览器通常可以使用相对 URI,但 Google 网站管理员工具建议它更喜欢绝对 URI(它们也会混淆 Web Sniffer)。是的,www. 是否被删除取决于 Apache 的配置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多