0

問題が見つからないようです。

// Check that someone from this IP didn't register a user within the last hour (DoS prevention)
$query = mysqli_query($dbc, "SELECT COUNT(id) FROM accounts WHERE registration_ip = '".$_SERVER['REMOTE_ADDR']."'  AND registered > ".(time() - 3600));

if (mysqli_num_rows($query) > 0) {
    $errors[] = 'To prevent registration flooding, at least an hour has to pass between registrations from the same IP. Sorry for the inconvenience.';
}

何があってもこれが常にtrueを返すのはなぜですか?アカウントテーブルが空の場合でも。

4

3 に答える 3

6

私が間違っていない場合、データは常にカウントの値を示す1行になります(カウントを使用しているため)。

于 2012-11-11T21:01:45.427 に答える
2

条件に一致する行が0行ある場合でも、これを返すだけです。

+-----------+
| COUNT(id) |
+-----------+
|         0 |
+-----------+

行のが欲しかったからですcount。その0。したがって、1つの行があります。

これがあなたがそれをどのように扱うべきかです。

$row = mysqli_fetch_row($query));
$count = intval($row[0]);
mysqli_free_result($query);

if ($count > 0)
....
于 2012-11-11T21:07:08.970 に答える
1

値ではなく、返された行をチェックしています。だからそのようにチェック

$row = mysqli_fetch_row($query));
$count = $row[0];

if ($count > 0)
{

}
于 2012-11-12T00:28:07.163 に答える