-1

我正在创建一个函数来根据用户名和密码检查我的数据库,如果匹配则返回 true 值,如果不匹配则返回 false (我使用了一些打印值来为自己提供视觉帮助)。现在,我的数据库中唯一的字段是 id = 1、用户名 = muyiwa、密码 = 密码(无论如何是 SHA1 加密版本)。其他任何东西都应该抛出错误值的错误,或者在我的具体情况下,第 22 行:打印“否”。

然而,情况似乎并非如此。这是代码:

function checkLoginName($username, $password) {
    global $mysqli;
    $username = sanitizeData($username);
    $password = SHA1($password);

    $sql = "SELECT COUNT(`id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'";
    $query = mysqli_query($mysqli, $sql) or die("Error: ".mysqli_error($mysqli));
    $rows = mysqli_num_rows($query);
    if ($rows == 1) {
        //return true;
        print "yes!";
    } else {
        //return false;
        print "no";
    }
}

checkLoginName("poo", "ha");

只是为了验证,“poo”和“ha”不应该返回“yes!”的值。因为它们不存在于数据库中,但确实存在!其他一切似乎都正常,我相信这是我的逻辑错误的 SQL 错误。

4

3 回答 3

3

你的逻辑是错误的:

$sql = "SELECT COUNT(`id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'";

您正在选择COUNT()并且将始终在结果集中返回一行。

在这种情况下,您只需将其更改为:

$sql = "SELECT `id` FROM `users` WHERE `username` = '$username' AND `password` = '$password'";

或者您将查询保持原样,获取您的行并检查COUNT.

于 2013-03-08T21:51:51.883 回答
1

您正在选择COUNT(). 这将始终返回一行

你不想检查mysqli_num_rows,因为它总是会1。相反,您想获取第一个结果行的第一列,因为那是您的COUNT结果。

于 2013-03-08T21:52:12.353 回答
0

使用COUNT(*)(或任何聚合)将始终返回至少1 行。

您可以像下面这样包装它,仅当存在COUNT> 0 时才返回一行。

SELECT * 
FROM   (SELECT Count(`id`) AS count 
        FROM   `users` 
        WHERE  `username` = '$username' 
               AND `password` = '$password') a
WHERE  a.count > 0 
于 2013-03-08T21:51:51.667 回答