0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 4
1

Форма логина работает неправильно

12.03.2018, 03:24. Показов 625. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите исправить код.
При вводе данных в поля выводит только "Не удалось открыть таблицу пользователей". Причем неважно, какие данные.
Если поля оставлять пустыми, то часть кода с "Пустые поля логина или пароля недопустимы" работают вплоть до закрытия программы.
Delphi
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
procedure TForm8.Button1Click(Sender: TObject);
var
pop:integer;
 
begin
pop:=strtoint(statusbar1.Panels[1].text);  //Задаем количество попыток
Adoquery1.Active:=false;
ADOquery1.sql.Clear;  //Чистим предыдущий запрос
ADOQuery1.SQL.ADD('SELECT * FROM user WHERE login = :p_login AND pass = :p_passw');  //Создаем запрос
if ((Edit1.Text <> '') and ((Edit2.Text) <> ''))
  then
  begin
    ADOQuery1.Parameters.ParamByName('p_login').Value := Edit1.Text;
    ADOQuery1.Parameters.ParamByName('p_passw').Value := Edit2.Text;
    try
      ADOQuery1.Active:=true;  //Пробуем активировать запрос
    Except
      ShowMessage('Не удалось открыть таблицу пользователей');
      Exit;
    end;
    if (ADOQuery1.RecordCount > 0) and ('prava'='admin') //Если заходим под админом
    then
    begin
      ShowMessage('Вход успешно выполнен, добро пожаловать, админ');
      Form2.Visible := False;
      Form1.Visible := True;  //Открываем главную форму
      form1.Button5.Enabled:=true;
      form1.Button5.visible:=true;
      adotable1.append;
      adotable1.fieldbyname('login').Value:=edit1.text; //Вносим в журнал аудита данные 
      adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime;
      adotable1.fieldbyname('sobitie').Value:='Выполнен вход в систему(администратор)';
      adotable1.Refresh;
    end
    else
  if  (ADOQuery1.RecordCount > 0)  //Если зашли под юзером
  then
   begin
     ShowMessage('Вход выполнен успешно');
      Form2.Visible := False;
      Form1.Visible := True; //Открываем главную форму
      form1.Button5.Enabled:=false;
      form1.Button5.visible:=false;
       adotable1.append;
      adotable1.fieldbyname('login').Value:=edit1.text; //Вносим в журнал аудита данные 
     adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime;
     adotable1.fieldbyname('sobitie').Value:='Выполнен вход в систему(пользователь)';
      adotable1.Refresh;
      end
      else
    begin
      ShowMessage('Неправильные логин или пароль'); 
                                                      //Если данные неверны очищаем поля и уменьшаем количество попыток
      Form8.Edit1.Text := '';
      Form8.Edit2.Text := '';
      pop:=pop-1;
    statusbar1.Panels[1].Text:=IntToStr(pop);
    if pop=0  then begin
ShowMessage('Превышено количество попыток входа!'+#13#10+'Приложение будет закрыто'); 
 adotable1.append;
      adotable1.fieldbyname('login').Value:=edit1.text;
     adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime;
      adotable1.Refresh;
      Application.Terminate;
end;
    end;
  end
  else    begin
    ShowMessage('Пустые поля логина или пароля недопустимы');
    pop:=pop-1;
    statusbar1.Panels[1].Text:=IntToStr(pop);
    if pop=0  then begin
ShowMessage('Превышено количество попыток входа!'+#13#10+'Приложение будет закрыто');   
 adotable1.append;
      adotable1.fieldbyname('login').Value:=edit1.text;
      adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime;
      adotable1.Refresh;
      Application.Terminate;
end;
end;
end;
 
procedure TForm8.FormCreate(Sender: TObject);
begin
DateTimePicker1.Format := 'dd.mm.yyyy hh:nn:ss';
DateTimePicker1.time:= now();
DateTimePicker1.date:= now();
end;
Вот так выглядит форма логина:
Миниатюры
Форма логина работает неправильно  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.03.2018, 03:24
Ответы с готовыми решениями:

Своя форма ввода логина и пароля
Добрый день всем читающим, нужна помощь в создании своей формы ввода логина и пароля для...

Неправильно работает StringGrid1
Суть проблемы такова что мы вводим кол-во вкладываемых средств от 3, и далее нажимаем кнопку...

Неправильно работает фильтрация
Добрый вечер, сделал динамическую фильтрацию работает нормально кроме одного момента например когда...

Фильтр работает неправильно
Привет, всем! Столкнулся с такой проблемой, хочу вывести по фильтру Заводской номер но когда ввожу...

5
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
12.03.2018, 04:25 2
Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
if (ADOQuery1.RecordCount > 0) and ('prava'='admin')
'prava'='admin' в качестве аналогии (2=3) думаю понятно, что за время работы кода число 2 никогда не станет равное числу 3.
1
0 / 0 / 0
Регистрация: 03.06.2015
Сообщений: 4
12.03.2018, 04:34  [ТС] 3
Delphi
1
   if (ADOQuery1.RecordCount > 0) and (adoquery1.FieldByName('prava').Value='admin')
Если так исправить, будет верно?
И да, в sql выдает Ошибка синтаксиса в предложении FROM.
0
5393 / 4321 / 1060
Регистрация: 29.08.2013
Сообщений: 27,128
Записей в блоге: 3
12.03.2018, 07:12 4
Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
if ((Edit1.Text <> '') and ((Edit2.Text) <> ''))
вот так не надо делать - один пробел и у тебя if не выполнится. нужно не проверять, а отсекать

если пароль не может быть пробелом, то
Delphi
1
if ((Trim(Edit1.Text) = '') and ((Trim(Edit2.Text) = '')) then Showmessage('Логин и\или пароль пусты'); exit; end
и все. и пользователь предупрежден и дальше не идем

Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
try
* * * ADOQuery1.Active:=true; *//Пробуем активировать запрос
* * Except
* * * ShowMessage('Не удалось открыть таблицу пользователей');
* * * Exit;
* * end;
тут в except может быть куча других ошибок. и что такое "не удалось открыть таблицу"???

Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
if (ADOQuery1.RecordCount > 0) and ('prava'='admin') //Если заходим под админом
* * then
вот отсюда и дальше у тебя проблемы с if
нужно по другому
if RecordCount>0 будет и у пользователя и у админа, значит эта проверка общая
а внутри уже дели на юзеров и админов

Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
adotable1.append;
* * * adotable1.fieldbyname('login').Value:=edit1.text;
* * * adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime;
* * * adotable1.Refresh;
* * * Application.Terminate;
для логирования нужно сделать 1 функцию в которой 1 sql запрос
Delphi
1
function Log(s:string);
ты ей передаешь свое сообщение, она записывает



Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
И да, в sql выдает Ошибка синтаксиса в предложении FROM.
в каком именно запросе?
1
669 / 559 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
12.03.2018, 07:15 5
Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
Если так исправить, будет верно?
Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
adoquery1.FieldByName('prava').Value='admin'
здесь сравнивается некое значение 'admin' со значением находящимся в наборе данных adoquery1 в первой записи в поле с именем 'prava'. Насколько это верно должно быть известно вам, а не мне.
Цитата Сообщение от Happy_Kapusta Посмотреть сообщение
И да, в sql выдает Ошибка синтаксиса в предложении FROM.
значит что-то в запросе не так.
Во первых не надо сразу пихать SQL запрос в компоненты. В начале нужно проверить в его работоспособность инструментами СУБД.
Во вторых после ввода параметров, отобрази полученный запрос на экране например с помощью showmessage(ADOQuery1.SQL.Text); и убедиться в правильности запроса.

Далее. Для того чтобы вам помогли решить вопрос требуется указывать используемая СУБД, код ошибки и текст ошибки. Здесь форум программистов, а не гадалок.
0
222 / 66 / 33
Регистрация: 23.05.2014
Сообщений: 715
12.03.2018, 08:19 6
Присоединившись к предыдущим авторам, от себя дополню:
1. Хранить пароли в БД в открытом виде - смертный грех. Для таких программистов есть отдельная жаровня в аду Необходимо шифровать пароль и его хэш хранить в БД.
2. Нет смысла закрывать программу при неправильных вводах пароля. Я заново открою ПО и буду дальше вспоминать/подбирать пароль. Если юзер верен, а пароль нет, то блокируйте пользователя через 3-5 попыток.
3. Права пользователей необходимо хранить в отдельной таблице и после удачного логина считывать их. И (тут уже от конструкции ПО зависит) скрывай/блокируй элементы меню, кнопки, прорисовывай интерфейс и т.д.
0
12.03.2018, 08:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2018, 08:19
Помогаю со студенческими работами здесь

Неправильно работает фильтр
Итак давайте все сначало. 1. Открываю Делфи7 На форму кидаю Table1, DataSource1, DBGrid1 2. Делаю...

Неправильно работает DBLookupComboBox
Здравствуйте, уважаемые форумчане! У меня возникла задача: сделать так, чтобы при выборе группы...

Неправильно работает авторизация в программе
написал прогу но чуть-чуть не могу врубиться(то ли уже мозги не варят то ли что...) так вот!...

Неправильно работает форма логина
Собственно вот код connectclass connnection = new connectclass(); DataTable...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru