[Delphi] Logowanie...

0

Witam Was serdecznie, mam problem z zrobieniem logowania do bazy danych postgres na komponencie ADO... poniżej przedstawiam kod, niestety nie działa to jak należy. Będę wdzięczny za jaką kolwiek pomoc.

procedure TForm1.Button2Click(Sender: TObject);
var odp: integer;
begin
odp:= Application.MessageBox('Czy chcesz opuścić program?', 'Wyjście z programu.', MB_YESNO or MB_ICONQUESTION);
if odp=IDYES then
Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text='') or (Edit2.Text='') then

Application.MessageBox('Wypełnij wymagane pola!', 'Logowanie', MB_OK or MB_ICONINFORMATION);

if (Edit1.Text<>'') and (Edit2.Text<>'') then
try

ADOConnection1.Connected := true;
ADOQuery.SQL.Text:='SELECT login, pass FROM operator';
ADOQuery.Open;

if ADOQuery.FieldValues['login']<>(Edit1.Text) then
if ADOQuery.FieldValues['pass']<>(Edit2.Text) then
Application.MessageBox('Wpisałeś złe dane!', 'Logowanie', MB_OK or MB_ICONINFORMATION);

if ADOQuery.FieldValues['pass']=(Edit2.Text) then
if ADOQuery.FieldValues['login']=(Edit1.Text) then

login_ok;

except
Application.MessageBox('Brak połączenia z bazą danych!', 'Uwaga!', MB_OK or MB_ICONINFORMATION);
end;
end;
0

Ale pokombinowałeś.
Po pierwsze:

if (login=edit1.text) and (pass=edit2.text) then login_ok

Zamiast 4 linijek, masz 2

Poza tym - trzymasz hasło w bazie jako zwykły, niezakodowany tekst?

Dalej. Zawsze używałem: FieldByName, zamiast FieldValues. Nie wiem, jaka jest różnica dokładnie, ale FieldByName daje Ci chyba więcej możliwości, zwłaszcza jeśli chodzi o porównania.

No i najważniejsza rzecz, którą dopiero zobaczyłem.

Z bazy musisz pobrać tylko hasło dla użytkownika o podanym loginie.

0

Jak <ort>na razie</ort> jako zwykly tekst, bedzie to moja pierwsza aplikacja bazodanowa, więc jak powinienem rozpisać kod żeby logowanie było poprawne :-/

Rozumiem, widzę że całkiem inaczej byś to zrobił, byłbyś tak dobry i i rozpisał ten cały kod? Nigdy nie robiłem w żadnym programie logowania i jeszcze na bazie danych :-/

Przerobiłem kod na następujący, działa wszystko ale tylko jeśli jest ten sam login jak i haslo bo inaczej pisze ze nie da rady sie zalogowac... :-/

procedure TForm1.Button2Click(Sender: TObject);
var odp: integer;
begin
odp:= Application.MessageBox('Czy chcesz opuścić program?', 'Wyjście z programu.', MB_YESNO or MB_ICONQUESTION);

if odp=IDYES then
Application.Terminate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text='') or (Edit2.Text='') then

Application.MessageBox('Wypełnij wymagane pola!', 'Logowanie', MB_OK or MB_ICONINFORMATION);

 if (Edit1.Text<>'') and (Edit2.Text<>'') then
  try
 ADOConnection1.Connected := true;
 ADOQuery.SQL.Text:='SELECT login, pass FROM operator';
 ADOQuery.Open;

 if (Edit1.Text=ADOQuery.FieldByName('login').AsString) and (Edit2.Text=ADOQuery.FieldByName('pass').AsString) then
   login_ok
 else
  Application.MessageBox('Wprowadziłeś złe dane!', 'Logowanie', MB_OK or MB_ICONINFORMATION);
   except
 Application.MessageBox('Brak połączenia z bazą danych!', 'Uwaga!', MB_OK or MB_ICONINFORMATION);
 end;
  end;

procedure TForm1.login_ok;
begin
Application.MessageBox('Zalogowano poprawnie', 'Logowanie', MB_OK or MB_ICONINFORMATION);
Form1.Hide;
Form2.Show;
end;
0

Kod powinien wygladac mniej wiecej tak:

procedure TForm1.Button2Click(Sender: TObject);
var 
  odp: integer;
begin
  if Application.MessageBox('Czy chcesz opuścić program?', 'Wyjście z programu.',MB_YESNO+MB_ICONQUESTION) = mrYes then
    Application.Terminate;
end;

function TForm1.KodujHaslo(haslo : string) : string;
begin
  {funkcja kodujaca haslo}
  Result := haslo;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if (Edit1.Text='') or (Edit2.Text='') then
    Application.MessageBox('Wypełnij wymagane pola!', 'Logowanie', MB_OK or MB_ICONINFORMATION);

  if (Edit1.Text<>'') and (Edit2.Text<>'') then
  try
    ADOConnection1.Connected := true;
    ADOQuery.SQL.Text:='SELECT login, pass FROM operator where login = ' + QuotedStr(Edit1.Text);
    ADOQuery.Open;
    if ADOADOQuery.Eof then
      Application.MessageBox('Operator o podanym loginie nie istnieje w bazie', 'Logowanie', MB_OK or MB_ICONINFORMATION)
    else  
      if (KodujHaslo(Edit2.Text)=ADOQuery.FieldByName('pass').AsString) then
        login_ok
      else
        Application.MessageBox('Wprowadziłeś złe hasło!', 'Logowanie', MB_OK or MB_ICONERROR);
   except
     Application.MessageBox('Brak połączenia z bazą danych!', 'Uwaga!', MB_OK or MB_ICONERROR);
   end;
end;

procedure TForm1.login_ok;
begin
  Application.MessageBox('Zalogowano poprawnie', 'Logowanie', MB_OK or MB_ICONINFORMATION);
  Form1.Hide;
  Form2.Show;
end;
0

Jeszcze raz :/
Zapytanie: "SELECT pass FROM operator WHERE login="+podany_login

Te dane wciągasz do ADOQuery, tak jak robisz(na co sprawdzenie if ADOQuery.eof?? :/)

A potem porównujesz(bo w adoQuery masz conajwyżej jeden rekord)

if ADOQuery.RecordCount>0 then
begin
  if ADOQuery.FieldByName('pass').AsString = edit2.text then zalogowany else bledne_haslo;
end else showMessage('Nie ma takiego użytkownika');

Trochę taki pseudokod, ale chyba jasne, co jest.

[dopisane]
Jeszcze jedna rzecz. Nie przewidziałeś sytuacji, gdzie użytkownik będzie chciał mieć puste hasło.

0
  try
    ADOConnection1.Connected := true;
    ADOQuery.SQL.Text:='SELECT COUNT(*) AS ile FROM operator WHERE login = :login AND pass = :pass';
    ADOQuery.ParamByName('login').AsString := edtLogin.Text;
    ADOQuery.ParamByName('pass').AsString := edtPass.Text;
    ADOQuery.Open;
    if ADOADOQuery.FieldByName('ile').AsInteger = 0 then
      Application.MessageBox('Wprowadziłeś zły login lub hasło!', 'Logowanie', MB_OK or MB_ICONERROR)
    else
      login_ok;
   except
     Application.MessageBox('Brak połączenia z bazą danych!', 'Uwaga!', MB_OK or MB_ICONERROR);
   end;

ogólnie nie rozróżnia się czy podano złe hasło, czy w ogóle nie ma takiego usera bo jak ktoś będzie chciał złamać hasło to podanie mu komunikatu, że 'błędny login i/lub hasło' mu utrudni życie

0

Witam, no działają jak najbardzier Wasze modyfikacje, dzięki Wielkie!

1 użytkowników online, w tym zalogowanych: 0, gości: 1