Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Endlosschleife nur warum? (https://www.delphipraxis.net/50785-endlosschleife-nur-warum.html)

scuby 31. Jul 2005 21:22


Endlosschleife nur warum?
 
Warum stecke ich hier in einer Endlosschleife?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,a1,b1,s : string;
var flag : byte;
begin
a := edit1.text;
b := edit2.text;

s := 'select Name,Passwd from ausbilderlogin';
query1.close;
Query1.Sql.Clear;
Query1.Sql.Add(s);
Query1.ExecSQL;
Query1.Active:=true;
Query1.First;

while not Form1.Query1.Eof do
begin
a1:= query1.Fieldbyname ('Name').AsString;
b1:= query1.Fieldbyname ('Passwd').AsString;
if (a = a1) and (b = b1) then flag := 1 else query1.Next;
end;

if flag <> 1 then showmessage('Falscher Loginname oder Passwort');
if flag = 1 then showmessage('Sie sind nun als '+a+' eingeloggt!');
end;

Jens Schumann 31. Jul 2005 21:28

Re: Endlosschleife nur warum?
 
Hallo,
wenn die Bedingung (a = a1) and (b = b1) erfüllt ist tritt Deine Schleife, weil kein Query.Next mehr kommt, auf der Stelle.

KLS 1. Aug 2005 03:56

Re: Endlosschleife nur warum?
 
flag würde ich als boolean nehmen.
Delphi-Quellcode:
flag := false;
while not Form1.Query1.Eof {or not flag} do
begin
  a1 := query1.Fieldbyname('Name').AsString;
  b1 := query1.Fieldbyname('Passwd').AsString;
  flag := (a = a1) and (b = b1);
  query1.Next; //wurde bei dir nicht mehr aufgerufen, wenn die obere bedingung erfüllt war
end;

Sharky 1. Aug 2005 06:01

Re: Endlosschleife nur warum?
 
Hai suby,

ersteinmal: "Herzlich Willkomen in der Delphi-PRAXiS" :-D

Warum Du eine Endlosschleife hast wurde ja schon erklärt.

Aber ich habe noch zwei grundsätzliche Anmwerkungen zu deinem Code ;-)

a)
Du verwendest sowohl Delphi-Referenz durchsuchenExecSQL als auch Active:=true; (Open).
ExecSQL wird nur verwendet wenn man von einem SQL-Befehl keine Ergebnissmenge zurück bekommt. Zum Beipspiel bei INSERT und UPDATE Anweisungen.

Open bzw. Active:=true wird verwendet wemm man etwas zurück bekommt (SELECT Anweisung). Beides zusammen macht also keinen Sinn ;-)

b)
Ich würde die gesamte Abfrage anders machen. Eigentlich möchtest Du doch folgendes wissen: "Gibt es in der Tabelle einen Eintrag mit Benutzername = X und Passwort = Y. Also, dann fragen wir das doch auch genau so die Datenbank.

Delphi-Quellcode:
function TForm1.CheckUserName(const aName, aPassword: string): boolean;
begin
  try
    with Query1 do
    begin
      Close;
      SQL.Text := 'SELECT COUNT(*) FROM ausbilderlogin ' + #10 +
        'WHERE name = :pname AND passwd = :ppassword';
      ParamCheck := True;
      ParamByName('pname').AsString := aName;
      ParamByName('ppassword').AsString := aPassword;
      Open;
      Result := Fields[0].AsInteger = 1;
      Close;
    end;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  user:    string;
  passwort: string;
begin
  user := Edit1.Text;
//  passwort := MD5_Hash2String(MD5_String(Edit2.Text));
  passwort := Edit2.Text;
  if CheckUserName(user,passwort) then
  begin
    ShowMessage(Format('Sie sind nun als %s eingeloggt',[user]));
  end
  else
  begin
    ShowMessage('Falscher Loginname oder Passwort');
  end;
end;
P.S.:
Kennwörter sollten nie im Klartext in der Tabelle stehen. Verwende dafür lieber einen (MD5)-Hash.

scuby 3. Aug 2005 17:33

Re: Endlosschleife nur warum?
 
Vielen Dank für eure Hilfe, habe die Endlosschleife nun endlich weg bekommen durch eure Hilfe

THX
Scuby


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz