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

Happy_Kapusta

Здравствуйте, помогите исправить код. При вводе данных в поля выводит только "Не удалось открыть таблицу пользователей". Причем неважно, какие данные. Если поля оставлять пустыми, то часть кода с "Пустые поля логина или пароля недопустимы" работают вплоть до закрытия программы.
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;
Вот так выглядит форма логина:
5 ответов

Happy_Kapusta

if (ADOQuery1.RecordCount > 0) and ('prava'='admin')
'prava'='admin' в качестве аналогии (2=3) думаю понятно, что за время работы кода число 2 никогда не станет равное числу 3.


Happy_Kapusta

   if (ADOQuery1.RecordCount > 0) and (adoquery1.FieldByName('prava').Value='admin')
Если так исправить, будет верно? И да, в sql выдает Ошибка синтаксиса в предложении FROM.


Happy_Kapusta

if ((Edit1.Text <> '') and ((Edit2.Text) <> ''))
вот так не надо делать - один пробел и у тебя if не выполнится. нужно не проверять, а отсекатьесли пароль не может быть пробелом, то
if ((Trim(Edit1.Text) = '') and ((Trim(Edit2.Text) = '')) then Showmessage('Логин и\или пароль пусты'); exit; end
и все. и пользователь предупрежден и дальше не идем
try * * * ADOQuery1.Active:=true; *//Пробуем активировать запрос * * Except * * * ShowMessage('Не удалось открыть таблицу пользователей'); * * * Exit; * * end;
тут в except может быть куча других ошибок. и что такое "не удалось открыть таблицу"???
if (ADOQuery1.RecordCount > 0) and ('prava'='admin') //Если заходим под админом * * then
вот отсюда и дальше у тебя проблемы с if нужно по другому if RecordCount>0 будет и у пользователя и у админа, значит эта проверка общая а внутри уже дели на юзеров и админов
adotable1.append; * * * adotable1.fieldbyname('login').Value:=edit1.text; * * * adotable1.fieldbyname('time').value:=DateTimePicker1.DateTime; * * * adotable1.Refresh; * * * Application.Terminate;
для логирования нужно сделать 1 функцию в которой 1 sql запрос
function Log(s:string);
ты ей передаешь свое сообщение, она записывает
И да, в sql выдает Ошибка синтаксиса в предложении FROM.
в каком именно запросе?


Happy_Kapusta

Если так исправить, будет верно?
adoquery1.FieldByName('prava').Value='admin'
здесь сравнивается некое значение 'admin' со значением находящимся в наборе данных adoquery1 в первой записи в поле с именем 'prava'. Насколько это верно должно быть известно вам, а не мне.
И да, в sql выдает Ошибка синтаксиса в предложении FROM.
значит что-то в запросе не так. Во первых не надо сразу пихать SQL запрос в компоненты. В начале нужно проверить в его работоспособность инструментами СУБД. Во вторых после ввода параметров, отобрази полученный запрос на экране например с помощью showmessage(ADOQuery1.SQL.Text); и убедиться в правильности запроса.Далее. Для того чтобы вам помогли решить вопрос требуется указывать используемая СУБД, код ошибки и текст ошибки. Здесь форум программистов, а не гадалок.


Happy_Kapusta

Присоединившись к предыдущим авторам, от себя дополню: 1. Хранить пароли в БД в открытом виде - смертный грех. Для таких программистов есть отдельная жаровня в аду Необходимо шифровать пароль и его хэш хранить в БД. 2. Нет смысла закрывать программу при неправильных вводах пароля. Я заново открою ПО и буду дальше вспоминать/подбирать пароль. Если юзер верен, а пароль нет, то блокируйте пользователя через 3-5 попыток. 3. Права пользователей необходимо хранить в отдельной таблице и после удачного логина считывать их. И (тут уже от конструкции ПО зависит) скрывай/блокируй элементы меню, кнопки, прорисовывай интерфейс и т.д.