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