繁体   English   中英

PHP登录的未知问题

[英]unknown problems with php login

我是新来的,很高兴认识你们所有人^ _ ^

我有一个项目,目的是实施一个允许用户登录的简单网站,我尝试在网上搜索,但仍然不知道如何解决。 下面是我在参考了多个源代码后编写的代码(login.php)。

if(!($stmt = $mysqli->prepare("SELECT * FROM attendant WHERE username = ?")))
{
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
else
{
    if(!($stmt->bind_param('s',$username)))
    {
        echo "bind parameter failed";
    }
    else
    {
        if(!($stmt->execute()))
        {
            echo "Execute Failed:(" . $stmt->errno .")". $stmt->error;
        }
        else
        {
                $res = $stmt->get_result();
                while($row = $res->fetch_assoc())
                {
                    if($row["username"] == $username && $row["password"] == $password && $row["status"] == $status)
                    {
                        $_SESSION['user']=$username;
                        header("Location: test.html?user=$username");
                    }
                    else if($row["username"] == $username && $row["password"] == $password && $row["status"] != $status)
                    {
                        header("Location: test.html?user=$username#verify-slide");
                    }
                    else
                    {
                        header("Location: test.html?Login=Fail#login-slide");
                    }
                }
            }
        }
    }
    $stmt->close();

}           

如果用户名确实存在于数据库中,则登录名可以正常工作。 但是,如果不是这样,则该功能将无法正常工作,只会保留在login.php文件中。

如果db中没有匹配的记录,那么它将不会进入while循环。

添加exit(); head(...) ,并放置header("Location: test.html?Login=Fail#login-slide"); 在while循环之外。

而且while循环不是必需的,您可以像下面这样更改代码:

$res = $stmt->get_result();
if ($row = $res->fetch_assoc() && $row["password"] == $password) {
    if($row["status"] == $status) {
        $_SESSION['user']=$username;
        header("Location: test.html?user=$username");
    } else {
        header("Location: test.html?user=$username#verify-slide");
    }
} else {
   header("Location: test.html?Login=Fail#login-slide");
}
exit();

如果没有与用户名匹配的内容,则永远不会进入while循环。 这意味着您的脚本将继续到最后。 您应该首先在每个标头调用之后放置一个exit()语句。 然后,如果在while循环后用户名不存在,您应该做任何想做的事情。

也许你可以试试这个:

if(!($stmt = $mysqli->prepare("SELECT * FROM attendant WHERE username = ?")))
{
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
else
{
    if(!($stmt->bind_param('s',$username)))
    {
       echo "bind parameter failed";
    }
else
{
    if(!($stmt->execute()))
    {
        echo "Execute Failed:(" . $stmt->errno .")". $stmt->error;
    }
    else
    {
            $res = $stmt->get_result();
            if($res->mysqli_num_rows()==0)
            {
                 header("Location: test.html?Login=Fail#login-slide");
            }
            else
            {  
              while($row = $res->fetch_assoc())
              {
                if($row["username"] == $username && $row["password"] == $password && $row["status"] == $status)
                {
                    $_SESSION['user']=$username;
                    header("Location: test.html?user=$username");
                }
                else if($row["username"] == $username && $row["password"] == $password && $row["status"] != $status)
                {
                    header("Location: test.html?user=$username#verify-slide");
                }                   
              }
           }
        }
    }
}
$stmt->close();

}        

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM