1

コードのこの部分が返さtrueれるべきではないのに返されるのはなぜですか?

$stmt = $dbh->prepare("SELECT COUNT(`user_id`) FROM `users` WHERE `username`= :username LIMIT 1");
$stmt->bindParam(':username', $username);
$stmt->execute();
return ($stmt->rowCount() == 1) ? true : false;

すでに登録されているフィールドにユーザー名を入力すると、true が返され、次のように出力されます。

That username has already been taken!

ただし、登録されていないユーザー名を入力すると、true が返され、上記の行が出力されます。これがなぜなのか、どのように修正できるのかわかりません。

PHP のマニュアルrowCount()に、クエリに問題があると記載されていることは知っていSELECTますが、クエリの影響を受ける行数を返す回避策が見つかりませんSELECT

4

3 に答える 3

2

値が 0 の場合でも、COUNT() は常に 1 行を返すためです。

代わりに SELECT TRUE を実行できます。

SELECT TRUE FROM `users` WHERE `username`= :username LIMIT 1

または、値が 0 より大きいかどうかを確認できます。

return ($stmt->fetchColumn() > 0);

ところで - 「? true : false」の部分は冗長です。ブール条件を持つこと自体がまさにそれを行います。

于 2011-12-27T21:24:00.967 に答える
1

結果行数を確認しています。クエリは常に正確に 1 つの結果行をrowCount()返すため、1 を返します。1 つの結果行には、クエリの 0 または 1 などのカウントが含まれます。

結果行のそのカウント値を確認するか、ユーザーが存在しない場合に行を返さないようにクエリを変更する必要があります。

于 2011-12-27T21:31:18.623 に答える
0

バインドせずに簡単に試してください:

$res = $dbh->query('SELECT COUNT(`user_id`) AS total FROM `users` WHERE `username`= "'.$username.'" ')->fetch();

return ($res['total'] == 1) ? true : false;
于 2011-12-27T21:31:36.590 に答える