我在数据库中有两个用户,当我尝试登录时,它只停留在索引页面上。如果一个用户在数据库中,您可以正常登录,但有两个用户,它只是重定向到索引页面。问题是什么。
<?php
include("connect.php");
$username = $_POST["username"];
$password = $_POST["password"];
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
echo $username;
echo $password;
if (empty($_POST['username']) || empty($_POST['password']))
{
//$_SESSION["login_error"] = "1";
echo 'error code 1';
header ('Location: ../index.php');
}
//$password = sha1($password);
$sql = "SELECT * FROM users";
$result = mysql_query($sql);
if (!$result) die('Invalid query: ' . mysql_error());
$userid = "";
while ($row3 = mysql_fetch_array($result, MYSQL_ASSOC))
{
if(($username == $row3["username"]) && ($password == $row3["password"]))
{
$userid = $row3["id"];
$_SESSION["userid"] = $userid;
//$online = mysql_query("UPDATE numbers SET online='1' WHERE id='".$userid."'")
//or die(mysql_error());
//$type = mysql_query("UPDATE numbers SET type='facetime' WHERE id='".$userid."'")
//or die(mysql_error());
echo $userid;
echo 'error code 2';
header ('Location: ../control_panel.php');
}
else
{
$userid = "";
$_SESSION["userid"] = "";
header ('Location: ../index.php');
echo 'error code 3';
}
//debug
//echo $password;
//$useridvar = $_SESSION["userid"];
//echo $useridvar;
}
if ($_SESSION["userid"]=="")
{
header ('Location: ../index.php');
echo 'error code 4';
}
//else
//{
// $userid = "";
// $_SESSION["userid"]= "";
// header ('Location: ../login.php');
//}
?>
答案 0 :(得分:4)
你的代码非常糟糕。您正在遍历整个用户表?那是糟糕的。试试这个:
<?php
include("connect.php");
$username = $_POST["username"];
$password = $_POST["password"];
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
if (empty($_POST['username']) || empty($_POST['password']))
{
header ('Location: ../index.php?emptyusernameorpassword');
die();
}
$result = mysql_query("SELECT * FROM users where username = '".$username."' and password = '".$password."' LIMIT 1") or die('Invalid query: ' . mysql_error());
$row3 = mysql_fetch_assoc($result);
if(mysql_num_rows($result) != 0)
{
$_SESSION["userid"] = $row3["id"];
header ('Location: ../control_panel.php');
die();
}
else
{
$_SESSION["userid"] = "";
header ('Location: ../index.php?invaliduserorpassword');
die();
}
?>
答案 1 :(得分:3)
好吧,其他答案已经指出了你的主要错误:“在发送标题之前不要输出任何内容”。 Develroot还说你不应该遍历用户表的所有记录。
但如果你仍然对原因感兴趣为什么两个用户被重定向到索引,那么这就是答案:
在循环中,您计划循环遍历users表的所有记录,如果找到正确的记录,则会重定向到正确的位置,如果发现错误的记录,则重定向到索引
因此,根据表中记录的顺序,您的代码通常会这样做:
如果你在找到好用户后打破了你的循环,你的代码就可以了。 (效率不高,但可行)。
当然,你真的应该按照Develroot建议的方式设计这个程序。
答案 2 :(得分:2)
拨打header()
功能之前,系统会调用echo()
。据我所知,如果您的脚本之前生成输出,则添加HTTP标头将不起作用。另外,我认为Location
HTTP标头需要以http://
或/
开头的绝对路径。然后,您应该在致电exit()
后立即添加header()
来电,以防止稍后添加任何其他标头信息。
答案 3 :(得分:1)
在发出'header'命令之前,您无法输出。
此外,您需要在header命令后直接发出'exit'。
答案 4 :(得分:0)
我看不到你调用session_start()的位置;如果你想在任何脚本中使用$ _session ['var'],这应该是ur代码中的第一行,你应该首先使用session_start()启动会话,然后每个header()调用都应该跟'exit;'没有'即退出;否则脚本将继续执行,并且不会加载标题中指定的链接。
答案 5 :(得分:-1)
您是否检查了错误日志?
你正在回复文字然后发送标题,这不会起作用。
确保在你的php.ini中设置了display_errors 1 并在文件的顶部error_reporting(-1);