PHP登录脚本不起作用

时间:2011-07-29 09:10:50

标签: php html logic

我在数据库中有两个用户,当我尝试登录时,它只停留在索引页面上。如果一个用户在数据库中,您可以正常登录,但有两个用户,它只是重定向到索引页面。问题是什么。

<?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');
    //}

?>

6 个答案:

答案 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表的所有记录,如果找到正确的记录,则会重定向到正确的位置,如果发现错误的记录,则重定向到索引

因此,根据表中记录的顺序,您的代码通常会这样做:

  • 记录1:好用户?是。然后将“位置”设置为“面板”
  • 记录2:好用户?否。覆盖“位置”,设置为“索引”。

如果你在找到好用户后打破了你的循环,你的代码就可以了。 (效率不高,但可行)。

当然,你真的应该按照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);