Чудеса авторизации в Delphi. Что делать?

Для ясности, использую: Delphi 10, СУБД Firebird + IBExpert, компоненты с палитры InterBase Теперь суть: Есть БД с таблицей пользователей и форма авторизации в программе Пользователи прекрасно добавляются, отображаются, редактируются и удаляются в/из БД без проблемТеперь проблема: В таблице два пользователя Первый прекрасно проходит авторизацию всё без проблем, НО... на второго пользователя форма авторизации почему-то постоянно орет что логин/пароль не верен (чего по сути не может быть)Кто сталкивался с такой проблемой?
6 ответов

А код-то будет? Или магический шар из под дивана выкатывать?


Конечно будет, просто не знал отзовется ли кто-нибудь вообще
procedure TForm16.sBitBtn1Click(Sender: TObject);
begin
if Form1.IBDatabase1.Connected=True then
begin
if
(Form17.DBGrid1.Fields[1].AsString = ELog.Text) and
(Form17.DBGrid1.Fields[2].AsString = EPas.Text) and
(Form17.DBGrid1.Fields[3].AsString = 'Да') then
begin
Form18.Show;
end
else if
(Form17.DBGrid1.Fields[1].AsString = ELog.Text) and
(Form17.DBGrid1.Fields[2].AsString = EPas.Text) and
(Form17.DBGrid1.Fields[3].AsString = 'Нет')
then
begin
  Form1.Show;
end
else if(Form17.DBGrid1.Fields[1].AsString <> ELog.Text) or (Form17.DBGrid1.Fields[2].AsString <> EPas.Text) then
begin
MessageDlg('Логин и пароль не введены или введены не верно!', mtERROR,[mbOK], 0);
end
else if (ELog.Text<>'') and (EPas.Text<>'') then
begin
  MessageDlg('Введите логин и пароль', mtConfirmation,[mbOK], 0);
end;
end
else if Form1.IBDatabase1.Connected=False then
begin
  MessageDlg('Отсутствует связь с базой данных!'+#13#10+' Проверьте настройки подключения!', mtERROR,[mbOK], 0);
end;
 
end;
За то что проверка логин/пароль не оформлена запросом не пинать! Я с SQL пока на "ВЫ" и знаю пока только самые простенькие запросы


Начнем, пожалуй... 1. Зачем громоздить такие конструкции:
Если соединение есть
Тогда
...
Иначе
Если соединения нет 
тогда
...
Не проще ли сразу проверить наличие соединения и, если его нет, сообщить об этом и выйти из процедуры? Весь оставшийся код будет выполнен только тогда, когда соединение присутствует.
if Form1.IBDatabase1.Connected = False then
begin
  MessageDlg('Отсутствует связь с базой данных!'#13' Проверьте настройки подключения!', mtERROR,[mbOK], 0);
  Exit;
end;
...
2. Вот тут совсем непонятно, почему Вы делаете так...
if
(Form17.DBGrid1.Fields[1].AsString = ELog.Text) and
(Form17.DBGrid1.Fields[2].AsString = EPas.Text) and
(Form17.DBGrid1.Fields[3].AsString = 'Да') then ...
Почему для получения данных Вы обращаетесь к ДБГриду??? Это компонент для отображения записей из какого-либо Набора Данных. Почему Вы не берете данные непосредственно из своего НД? 3.
if(Form17.DBGrid1.Fields[1].AsString <> ELog.Text) or (Form17.DBGrid1.Fields[2].AsString <> EPas.Text) then
У Вас в таблице БД, как я понял, несколько пользователей... Так данные какого пользователя Вы проверяете? Естественно того, который в вашем НД, согласно правилам сортировки по умолчанию, стоит первым. Нет никакого критерия, по которому программа может определить, что в данный момент пытается войти пользователь с логином "Иванов", а не "Петров" и не "Силоров", и надо проверить, есть ли такой пользователь вообще в БД и правильный ли введен пароль... Ничего этого нет, вот Вам и ошибка! 4.
if (ELog.Text<>'') and (EPas.Text<>'') then
begin
  MessageDlg('Введите логин и пароль', mtConfirmation,[mbOK], 0);
end;
В этом моменте, следуя Вашей логике, если я заполнил поля ввода логина и пароля, т.е. эти поля не пусты (NNN.Text <> '') - то я как раз и получу такое вот сообщение! Странно как-то... 5.
Я с SQL пока на "ВЫ" и знаю пока только самые простенькие запросы
А тут нет и не надо никаких "наворотов" - самый банальный запрос:
//Заполнили свойство SQL компонента IBQuery текстом SQL-запроса. 
//Ищем значение поля Password из таблицы MyTable
//В качестве критерия поиска выступает логин, который пользователь вводит в поле ELog
IBQuery.SQL.Text = 'SELECT Password FORM MyTable WHERE Login = ' + QuotedStr(ELog.Text);
//Выполняем запрос
IBQuery.Open;
//Проверяем, нашлось вообще хоть что-нибудь, т.е. есть ли такой пользователь в БД
//Если пользователя нет - сообщаем и выходим
if IBQuery.IsEmpty
  then begin
        ShowMessage('Нет такого');
        Exit;
       end;
//Если пользователь в наличии - проверяем его пароль
if IBQuery.FieldByName('Password').AsString = EPas.Text
//Если пароль верен - делает одно
  then ShowMessage('Yes')
//Если пароль неверен - делаем другое
  else ShowMessage('No');


Дело то вот в чем,в таблице находится четыре поля: USER, LOGIN, PASS и SVISOR(varchar) - которое определяет является ли пользователь админом(т.е. есть ли у него доступ к скрытым формам и возможностям) и содержит только не логические(просто не знаю как это в IBExpert) - да/нет. Отсюда и вся канитель.


и содержит только не логические(просто не знаю как это в IBExpert) - да/нет
Не проще ли сделать поле числовым и присваивать 1, если админ и 0, если нет?
Отсюда и вся канитель
Не вижу абсолютно никакой канители...
//Заполнили свойство SQL компонента IBQuery текстом SQL-запроса. 
//Ищем все поля из таблицы MyTable
//В качестве критерия поиска выступает логин, который пользователь вводит в поле ELog
IBQuery.SQL.Text = 'SELECT * FORM MyTable WHERE Login = ' + QuotedStr(ELog.Text);
//Выполняем запрос
IBQuery.Open;
//Проверяем, нашлось вообще хоть что-нибудь, т.е. есть ли такой пользователь в БД
//Если пользователя нет - сообщаем и выходим
if IBQuery.IsEmpty
  then begin
        ShowMessage('Нет такого');
        Exit;
       end;
//Если пользователь в наличии - проверяем его пароль
if IBQuery.FieldByName('Pass').AsString <> EPas.Text
//Если пароль неверен - сообщаем об этом и выходим
  then begin
           ShowMessage('Yes');
           Exit;
        end;
//Если пароль верен - проверяем, админ ли вошедший пользователь
if IBQuery.FieldByName('Svizor').AsInteger = 1
 then //Делаем что-то, когда вошедший является админом
 else //Делаем что-то, когда вошедший не является админом
Вот, собственно, вся Ваша авторизация... И при чем там какие-то DBGrid-ы были - непонятно...


мда.. ларчик просто открывался...