Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для Sanu0074
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5

При неправильном вводе логина и пароля нехочит добавлять запись об этом в БД, где-то мелкая ошибка

30.01.2012, 18:09. Показов 1809. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю проверку логина и пароля на сайте, всё работает, но если неправильно вводиш логин и пароль - ip-адрес юзера должен записываться в бд, и гдето я тут допустил ошибку, нехочет проверять количество неудачных попыток и нехочет добавлять запись о неудачной попытке, а проверка логина и пароля и удаление записей за последних 15 минут работает, ниже код, в комментариях пометил строки что неработают, и вот таблица БД:
SQL
1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `addresation` (
  `ip` VARCHAR(12) NOT NULL,
  `date` datetime NOT NULL,
  `col` INT(1) NOT NULL,
  PRIMARY KEY (`ip`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<?php 
session_start();            
 
 
class User
{
    public $dbh;
    
    function __construct($host,$db_name,$user,$pass)
    {
        $this -> dbh = new PDO("mysql:host=$host;dbname=$db_name",$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES cp1251"));
    }
    
    public function scan_pass($login,$password,$save)
    {
        $date=date("Y/m/d G:i:s");
        $ip=getenv("HTTP_X_FORWARDED_FOR");
        
        $min_15 = date("Y/m/d G:i:s",time()-900);
        
        if(empty($ip) || $ip=='unknown') {$ip=getenv("REMOTE_ADDR"); }//извлекаем ip
        $fiftMin=$this->dbh->prepare("DELETE FROM addresation WHERE `date`>?");//удаляем ip-адреса ошибавшихся при входе
        $fiftMin->execute(array($min_15));
        
        ////////////
        //НЕРАБОТАЕТ
        $neyd = $this->dbh->prepare("SELECT `col` FROM `addresation` WHERE `ip`=?");//извлекаем из базы количество неудачных попыток входа за последние 15 у пользователя с данным ip 
            $neyd->execute(array($ip));
            $neyd_row = $neyd->fetch();
            if($neyd_row['col'] > 2) 
            {
                exit("<div align='center'><font color='#FF0000'>Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки.</font></div>");
            }     
////////////////////////////////////////////////////////
        
        
        $count_rows=$this->dbh->prepare("SELECT `login`,`password` FROM `users` WHERE `login`=? AND `password`=? ");
            $count_rows->execute(array($login,$password));
             $res_count=$count_rows->fetch();
                                                                                /////////////////////////////////////////////////
            if($res_count['login']!=$login && $res_count['password']!=$password)//НЕРАБОТАЕТ
            {                                                                   /////////
                //если пользователя с введенным логином и паролем не существует
                //Делаем запись о том, что данный ip не смог войти. 
                $sel=$this->dbh->prepare("SELECT `ip` FROM `addresation` WHERE `ip`=? ");
                $sel->execute(array($ip));
                $sel_row = $sel->fetch();
                if ($ip == $sel_row['ip']) 
                {
                    //проверяем, есть ли пользователь в таблице "addresation" 
                    $sel2 = $this->dbh->prepare("SELECT `col` FROM `addresation` WHERE `ip`=?"); 
                    $sel2->execute(array($ip));
                    $sel2_row = $sel2->fetch();   
                    $col = $sel2_row['col'] + 1;//прибавляем еще одну попытку неудачного входа 
                    $sel7 = $this->dbh->prepare("UPDATE `addresation` SET col=?, date=? WHERE ip=?");  
                    $sel7->execute(array($col,$date,$ip));     
                }
                else 
                {
                    $sel3=$this->dbh->prepare("INSERT INTO `addresation` `ip`=?, `date`=?, `col`=? ");
                    $sel3->execute(array($ip,$date,1));
                    //если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "addresation"
                }  
                exit ("<div align='center'><font color='#FF0000'>Введённый вами логин или пароль неверный!</font></div>");
            }
            else 
            {          
             //если пароли совпадают, то запускаем пользователю сессию 
              $_SESSION['login']=$login;
              $_SESSION['password']=$password;
               
               
               require_once('conf/func/checkBrowser.php');
               $browser=checkBrowser();
 
                $sel8 = $this->dbh->prepare("UPDATE `users` SET `last_visit`=?,`browser`=? WHERE `login`=?");  
                $sel8->execute(array($date,$browser,$this->$login)); 
                
                
                if($save=='checked')
                {
                    setcookie("login",$login,0x7FFFFFFF);   
                    setcookie("password",$password,0x7FFFFFFF);
                }
                
                echo "Добро пожаловать ".$login;
            }                  
             
    }
}
 
 
 
 
$user = new User($host,$db_name,$user,$pass);
if(empty($_POST['user_login'])&&empty($_POST['user_pass'])){exit("Введите логин и пароль!");}
    $login = iconv("UTF-8","windows-1251",$_POST['user_login']);
    $password = iconv("UTF-8","windows-1251",$_POST['user_pass']);
    
    if(isset($_POST['save_me']))
    {$save=iconv("UTF-8","windows-1251",$_POST['save_me']);}
    
     $user->scan_pass($login,$password,$save);
                    
?>
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.01.2012, 18:09
Ответы с готовыми решениями:

Не выводит сообщение о ошибке при неправильном вводе логина или пароля на страничке
не хочет выводить сообщение при неправильном вводе логина или пароля на страничке вот код protected void Button1_Click(object sender,...

Блокировка формы при неправильном вводе пароля
Есть форма на которой вводится пароль, после успешного ввода открывается вторая форма. Как ограничить количество попыток ввода пароля?...

VBulletin НЕ пускает при вводе логина и пароля
Такая ситуация: есть основной домен и сабдомен, на основном сайт и в нем в папке forum находится сам форум. Так вот: если логинится...

7
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
01.02.2012, 18:04
PHP
1
$count_rows=$this->dbh->prepare("SELECT `login`,`password` FROM `users` WHERE `login`=? AND `password`=? ");
чет я не догнал , юзер вводит данные логин и пороль , ты вынимаешь из базы запись где логин равен логину и пороль поролю . Есть 2 варанта либо есть такая запись либо нет , что это за проверка ?
PHP
1
if($res_count['login']!=$login && $res_count['password']!=$password)
Добавлено через 10 минут
всё очень непонятно и запутанно ,яб переписал всё
0
 Аватар для Sanu0074
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
01.02.2012, 19:29  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
юзер вводит данные логин и пороль , ты вынимаешь из базы запись где логин равен логину и пороль поролю . Есть 2 варанта либо есть такая запись либо нет , что это за проверка ?
я так делаю, а как ещё? и чем этот вариант плох?
0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
01.02.2012, 19:43
ну так и делают , вот токо у тебя намудренно тут , куча мусора ничего не понятно , разложил бы по красивым методам :
проверка совпадения логина и пороля с базой - возвращает тру фолс . проверка были ли введены 3 раза неверно пороль , возвращает тру фолс . Добавление в базу неверный ввод . Расчет записей по времени . Стереть устаресвхие данные .

Тогда и проще и понятнее былоб . а тут всё в куче и хрен разберешся что где.
p.s. вообще метод не должен бить длинее 30 строк
0
 Аватар для Sanu0074
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
02.02.2012, 00:27  [ТС]
Цитата Сообщение от crautcher Посмотреть сообщение
ну так и делают , вот токо у тебя намудренно тут , куча мусора ничего не понятно , разложил бы по красивым методам :
проверка совпадения логина и пороля с базой - возвращает тру фолс . проверка были ли введены 3 раза неверно пороль , возвращает тру фолс . Добавление в базу неверный ввод . Расчет записей по времени . Стереть устаресвхие данные .

Тогда и проще и понятнее былоб . а тут всё в куче и хрен разберешся что где.
p.s. вообще метод не должен бить длинее 30 строк
ну в 30 строк невсегда можно вложиться... для меня тут всё понятно, я согласен что трудно рабраться в этом коде, мусора тут много, неработает почемуто этот участок:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  $sel=$this->dbh->prepare("SELECT `ip` FROM `addresation` WHERE `ip`=? ");
                                $sel->execute(array($ip));
                                $sel_row = $sel->fetch();
                                if ($ip == $sel_row['ip']) 
                                {
                                        //проверяем, есть ли пользователь в таблице "addresation" 
                        $sel2 = $this->dbh->prepare("SELECT `col` FROM `addresation` WHERE `ip`=?"); 
                                        $sel2->execute(array($ip));
                        $sel2_row = $sel2->fetch();   
                                        $col = $sel2_row['col'] + 1;//прибавляем еще одну попытку неудачного входа 
                        $sel7 = $this->dbh->prepare("UPDATE `addresation` SET col=?, date=? WHERE ip=?");  
                                        $sel7->execute(array($col,$date,$ip));     
                                }
                                else 
                                {
                        $sel3=$this->dbh->prepare("INSERT INTO `addresation` `ip`=?, `date`=?, `col`=? ");
                                        $sel3->execute(array($ip,$date,1));
                        //если за последние 15 минут ошибок не было, то вставляем новую запись в таблицу "addresation"
и этот:
PHP
1
2
3
4
5
6
7
 $neyd = $this->dbh->prepare("SELECT `col` FROM `addresation` WHERE `ip`=?");//извлекаем из базы количество неудачных попыток входа за последние 15 у пользователя с данным ip 
                        $neyd->execute(array($ip));
                        $neyd_row = $neyd->fetch();
                        if($neyd_row['col'] > 2) 
                        {
                exit("<div align='center'><font color='#FF0000'>Вы набрали логин или пароль неверно 3 раза. Подождите 15 минут до следующей попытки.</font></div>");
            }
наверное придётся переписать всё....
0
02.02.2012, 23:09

Не по теме:

Цитата Сообщение от Sanu0074 Посмотреть сообщение
вообще метод не должен бить длинее 30 строк
Это правилами PHP закреплено?

0
 Аватар для crautcher
2450 / 2301 / 597
Регистрация: 27.05.2011
Сообщений: 7,844
03.02.2012, 15:54
Цитата Сообщение от bober94 Посмотреть сообщение

Не по теме:



Это правилами PHP закреплено?

это признак плохой конструкции класса
0
03.02.2012, 23:19

Не по теме:

Цитата Сообщение от crautcher Посмотреть сообщение
это признак плохой конструкции класса
Первый раз слышу про такой признак.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.02.2012, 23:19
Помогаю со студенческими работами здесь

Разблокировка MainMenu при вводе логина и пароля
подскажите пожалуйста. поставил пароль не на всю форму, а только на компонент MainMenu, и теперь нужно чтобы при вводе логина и пароля этот...

Отображение звездочек при вводе логина и пароля
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main() { { setlocale(LC_ALL, &quot;Russian&quot;); } ...

Возврат при некорректном вводе пароля или логина
Здравствуйте. Подскажите пожалуйста, каким образом можно вернуть пользователя в то место, где ему нужно повторно ввести пароль/логин....

Друпал 7. При вводе логина и пароля администратора ERR_CONNECTION_RESET
авторизация администратора проходит, но при переходе на какой-либо пункт меню, то страница не доступна &quot;Соединение сброшено&quot;....

Ошибка при вводе в неправильном формате
Доброго всем времени суток! Есть код, очень простенький. И есть баг: если пользователь вводит вместо цифр буквы или ещё какую-нить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru