повторяющиеся записи при регистрации числа неудачных попыток входа в систему mysql / php - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть эта настройка для регистрации количества неудачных попыток входа с разных IP-адресов. Наверное, ненужное сложное.

Настройка базы данных mysql:

 CREATE TABLE login_attempts (
  id int(20) NOT NULL auto_increment,
  ip varchar(20) NOT NULL default '',
  `time` datetime NOT NULL default '0000-00-00 00:00:00',
  nr char(4) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM
# -------

поиск неудачных попыток входа в систему:

function ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;            
}   

$ip = ip(); 
$query = "SELECT `nr` from `login_attempts` WHERE `ip`='".$ip."' ";
$result = $conn->query($query);         
$user = $result->fetch_assoc();     
$failed_attempts = $user["nr"]; 

(... некоторый код ...)

В случае сбоя входа в систему:

    if( $failed_attempts == 0 ){

                $query = "INSERT INTO login_attempts (`ip`, `time`, `nr`) VALUES ('".$ip."', '".$time."', '1')";
                $result = $conn->query($query);             
                if (!$result){ trigger_error("mysql error: ".mysql_errno($result) . ": " . mysql_error($result)); return 0;  }

            } else {

                $query = "UPDATE login_attempts SET ip = '".$ip."', time = '".$time."', nr = nr + 1 "; 
                $result = $conn->query($query);             
                if (!$result){ trigger_error("mysql error: ".mysql_errno($result) . ": " . mysql_error($result)); return 0;  }

            } 

Это как-то дает повторяющиеся записи в моей БД. Тот же ip, другой nr .. Почему?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2011

Вы должны добавить условие WHERE во второй запрос SQL.В противном случае он обновит все строки в таблице.

0 голосов
/ 14 февраля 2011

Ваш запрос UPDATE не имеет предложения WHERE, поэтому он обновляет каждую строку в таблице , устанавливая для этих значений столбцы ip и time во всех строках.

$query = "UPDATE login_attempts SET time = CURRENT_TIMESTAMP, nr = nr + 1 WHERE ip = '$ip'";
...