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

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

30.01.2012, 18:09. Показов 1816. Ответов 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,845
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,845
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,845
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru