繁体   English   中英

我的简单 PHP 登录脚本没有按预期工作,我不知道为什么

[英]my simple PHP login script is not working as intended and i can't figure out why

所以我正在尝试编写一个从 MYSQL 获取信息的脚本,然后比较用户输入的用户名和密码,如果它们匹配,则只打印“登录成功”,然后“欢迎返回”用户名“”。

我必须使用某种循环来确保从表中检索到所有行,但这也会导致我的脚本无法正常工作,当我输入用户并从第一行传递时,它会按预期工作,但是当我输入第二个用户(我只在 mysql 中注册了两个用户),我首先收到“登录失败”消息然后“登录成功”然后欢迎回来。 在我看来,脚本检查第一个获取的数组,然后是第二个。 问题是我想不出另一种方法来编写相同的脚本。 你们能帮帮我吗?

在没有循环的情况下尝试了相同的查询,我只得到第一行。

<form method="post">
<input type="text" name="Username" placeholder="Username" ></input>
<input type="text" name="Password" placeholder="Password"></input>
<input type="submit" value="Login">
</form>


<?php
$login = false;
if ($_POST['Username'] && $_POST['Password'] !== "")
{
    $link = mysqli_connect("localhost" , "root" , "test" , "mahmood");
    if ($link == true)
    {
        $query = "SELECT * FROM `users`";
        $row = mysqli_query($link , $query);
        while(  $result = mysqli_fetch_array($row))
        {
            if ($result['username'] == $_POST['Username'] && $result['password'] == $_POST['Password'])
            {
                echo " login successful! "."<br>";
                $login = true;
                echo " Welcome back ".""."$_POST[Username]! ";
                die;
            } else {
                echo " wrong username or password! "."<br>";

            }
        }
        }

       else{
        echo "\n"."failed to connect to the database!"."\n";
    }

} else{echo "\n"."both username and password are required!"."\n";}



当我输入用户并通过时,期望“登录成功”和“欢迎回来消息”,而不是“登录失败”然后“登录成功”然后“欢迎回来”

您正在循环结果,并且在每次迭代中,如果登录名/密码不匹配,则会显示一条错误消息,这就是为什么您在看到成功之前获得 X 次登录失败的原因。

在成功部分,您使用了设置为 true 的 boolean 变量。 用它 !

while(  $result = mysqli_fetch_array($row))
{
    if ($result['username'] == $_POST['Username'] && $result['password'] == $_POST['Password'])
    {
        echo " login successful! "."<br>";
        $login = true; // <--------------- use this !
        echo " Welcome back ".""."$_POST[Username]! ";
        die;
    }
}
if (!$login)
{
    echo " wrong username or password! "."<br>";
}

这将修复您当前的代码,但是,您不应遍历整个用户列表。

如果你有 10 亿用户怎么办。 在意识到登录名/密码错误之前,您将进行 10 亿次迭代。

另外,这会消耗大量带宽(以及不必要的功率,想想绿色。)从用户表中获取所有信息。

您宁愿使用WHERE子句来过滤结果。 我想用户名是唯一的。 在用户名上使用WHERE子句将获取0 或 1 个结果,这将大大提高性能。

// Prepare the query, bind the parameters and execute it
$query = "SELECT password FROM `users` WHERE username = ?";
$stmt = mysqli_prepare($link , $query);
mysqli_stmt_bind_param($stmt, "s", $_POST['Username']);
mysqli_stmt_bind_result($stmt, $password);
// There will be only 1 loop since username should be unique
while (mysqli_stmt_fetch($stmt))
{
    if ($_POST['Password'] == $password)
    {
        $login = true;
        // success
    }
}
mysqli_stmt_close($stmt);

if (!$login)
{
    // failure
}

有关准备好的查询的更多信息,请阅读官方文档


$result['password'] == $_POST['Password']这段代码表明你的密码是以纯文本形式存储的。 这是一个非常糟糕的做法

密码应该被散列。

在数据库中注册用户时,可以使用password_hash()对密码进行哈希处理:

$hashedPasswoed = password_hash($PlainTextPassword, PASSWORD_DEFAULT);

当用户登录时,要比较密码,您可以使用password_verify()

// $password being the hashed password stored in database
if (password_verify($_POST['password'], $password))
{
    $login = true;
    // success
}

暂无
暂无

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

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