-1

ユーザー名とパスワードに対してデータベースをチェックして、一致する場合は true の値を返し、そうでない場合は false を返す関数を作成しています (いくつかの印刷値を使用して、視覚的な支援を行いました)。現在、私のデータベースのフィールドは id = 1、username = muyiwa、password = password (とにかく SHA1 暗号化バージョン) だけです。それ以外の場合は、値が正しくないというエラーがスローされるか、私の特定のケースでは 22 行目: print "no" がスローされます。

しかし、そうではないようです。コードは次のとおりです。

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()と、結果セットに常に1行が返されます。

この場合、次のように変更できます。

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

または、クエリをそのままにして、行をフェッチし、の値を確認しますCOUNT

于 2013-03-08T21:51:51.883 に答える
1

を選択していますCOUNT()。これは常に1行を返します。

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 に答える