Php 会话信息正在丢失

Php 会话信息正在丢失,php,Php,我正在运行一个登录脚本,根据谁登录,我重定向到两个页面中的一个 如果我指向位于主目录下的目录中的页面,则一切正常,但是如果我指向index.php文件所在目录上方的页面,则会话信息似乎丢失,并要求用户再次登录 我知道我可以简单地将第二个页面放在主目录下的一个目录中,但我想了解在指向主目录上的页面时是否可以维护会话信息 用户进入一个名为login.html的页面,当他们在那里输入信息时,他们被发送到login.php,在这里发生重定向 if ($username==$dbusername&

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

如果我指向位于主目录下的目录中的页面,则一切正常,但是如果我指向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>");


    ?>

要加载会话,必须将会话_start()放在每页的顶部

此外,在设置会话和重定向之前,您需要调用会话_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');
    }
}
标题('location:/member')

首先,这是无效的。
位置
标题后面应该是完整的URL,而不是相对的URL


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

我已将会话设置为启动();在用户需要登录才能访问的每个页面的开头,我还放置了session_start();在login.php的开头,请确保将会话_start()放在每个$_会话[?]=“”之前,并在设置会话之后放置header()函数。代码见我的编辑。我已经用登录的所有代码更新了我的问题。phpOh,我认为“dbpassoword”是一个输入错误,并将其更改为“dbpassword”。我已经修好了。请立即尝试。Location:标头不需要完整的URL。我每天只使用文件名。此外,如果htaccess文件配置为删除/member后面的斜杠,则不会更改。@BaileyMcAfee。
位置
标题。浏览器通常可以使用相对URI,但Google网站管理员工具建议它更喜欢绝对URI(它们也会混淆)。是的,是否删除
www.
取决于Apache的配置。您的问题不属于这个主题,但您已经做了很多事情:
“从username='$username'的用户中选择admin”
。您真的想使用准备好的语句或mysql\u real\u escape\u字符串。