Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADO Suche (https://www.delphipraxis.net/76432-ado-suche.html)

hirnstroem 4. Sep 2006 14:05

Datenbank: Mircosoft Access • Zugriff über: ADO

ADO Suche
 
'loha Folks,

ich versuche mich über ein Webinterface irgendwo einzuloggen. Beim Log-in, bei welchem Benutzername und Passwort eingegeben werden müssen, sollen die eingegebenen Daten mit jenen in einer Access Datenbank verglichen werden. Den richtigen Benutzernamen mache ich wie folgt ausfindig:

Delphi-Quellcode:
  ADOQuery_WebinterfaceUser.SQL.Text :=
    'SELECT * from WebinterfaceUser where Username is' + edtusername.Text +
    ';';
Nun soll aber der Benutzername nicht irgendwo aufgelistet werden, sondern es soll einfach verglichen werden ob der eingegebene Benutzername in der Datenbank vorhanden ist.

Wie kann ich nun, falls die Datenbankabfrage ein Ergebnis bringt, dieses mit der eingabe auf der Log-in Seite vergleichen?

Grüsse
hirnstroem

mkinzler 4. Sep 2006 14:08

Re: ADO Suche
 
SQL-Code:
SELECT count(*) from WebinterfaceUser where Username = :uname;

hirnstroem 5. Sep 2006 10:00

Re: ADO Suche
 
Gut, die Abfrage gibt mir ja nun den Benutzernamen zurück, aber wie kann ich mit diesem weiterarbeiten? Ich möchte nun den Benutzernamen aus der Abfrage mit jenem in meinem Loginfeld vergleichen.

Die Abfrage ist folgende

Delphi-Quellcode:
SELECT Username, MD5Hash
FROM WebinterfaceUser
WHERE Username = :Username
AND MD5Hash = MD5Hash;
Ist meine Annahme, dass z.B. :Username eine von mir definierte Variable in Delphi ist, richtig?

:Username und :MD5Hash (wird vorher "berechnet") werden in zwei Edit Felder eingegeben (normales Login). Beim klick auf einen Anmeldebutton wird der MD5Hash erstellt (aus dem Benutzernamen und dem Passwort) und die oben aufgeführte Abfrage ausgeführt.

Wie ich nun die Daten aus der Abfrage mit den Eingaben in den Edit Feldern verlgeiche bleibt mir trotzdem ein Rätsel.

marabu 5. Sep 2006 10:23

Re: ADO Suche
 
Hallo hirnstroem,

einen direkten Vergleich wirst du gar nicht durchführen. Wenn der Benutzername selektiert wird, dann signalisiert ein leerer result set eine fehlgeschlagene Identifizierung. Durch die Aufnahme des MD5-Hash in das Selektionskritierium wird sogar eine gesicherte Authentisierung in einer Abfrage möglich, allerdings hast du wohl in der Eile den Doppelpunkt vergessen.

Grüße vom marabu

hirnstroem 5. Sep 2006 11:57

Re: ADO Suche
 
Entschuldigt bitte, aber ich habe die ganze Sache noch nicht so wirklich verstanden.

Meine Prozedur für sieht folgendermassen aus:

Delphi-Quellcode:
procedure Tfrm_Login.btnloginClick(Sender: TObject);
var
  UsernamePasswordString: String;
  MD5Hash: String;
  Username: String;
  MD5DigestVar: MD5Digest;
  Result: Integer;
begin
  {Begin turn password to MD5 Hash}
  UsernamePasswordString := edtusername.Caption + edtpassword.Caption +
                            edtusername.Caption + edtpassword.Caption +
                            edtusername.Caption + edtpassword.Caption;
  MD5DigestVar := UMD5.MD5String(UsernamePasswordString);
  MD5Hash := UMD5.MD5Print(MD5DigestVar);
  {End turn password to MD5 Hash}

  Username := edtusername.Caption;

  if (Username = '') or (MD5Hash = '') then
  begin
    WebApplication.ShowMessage('Benutzername oder Passwort eingeben');
    Exit;
  end;

  {Begin check database for username andpassword}
  ADOQuery_WebinterfaceUser.Open;

  // Result := ?

  if not Result = 0 then
  begin
    {Start page load}
    if WebApplication.FindComponent('frm_Main') <> nil then
    begin
      TIWAppForm(WebApplication.FindComponent('frm_Main')).Show;
    end else
    begin
      Tfrm_Main.Create(WebApplication).Show;
    end;
    Release;
    {End page load}
  end;
  {End check databse for username and password}
end;
Delphi-Quellcode:
ADOQuery_WebinterfaceUser.Open;
^^ hiermit wird folgende Abfrage abgesetzt:

SQL-Code:
SELECT COUNT (*)
FROM WebinterfaceUser
WHERE Username = :Username
AND MD5Hash = :MD5Hash;
Wenn Datensätze gefunden werden, bekomme ich irgendwo (aber wo genau?) einen Integer mit dem Wert 1 (falls etwas gefunden wurde, mehr als einen Datensatz mit den eingegebenen Daten wird es ja nie geben) oder 0 (wenn keiner gefunden wird), zurück.

Mir fehlt jetzt einfach die Zuordnung zu der Vaiable "Result".

marabu 5. Sep 2006 12:38

Re: ADO Suche
 
Vielleicht so:

Delphi-Quellcode:
var
  isValid: Boolean;
begin
  // ...
{ Begin check database for username andpassword }
  with ADOQuery_WebinterfaceUser do
  begin
    Open;
    isValid := Fields[0].AsInteger = 1;
    Close;
  end;
marabu

hirnstroem 5. Sep 2006 13:14

Re: ADO Suche
 
Vielen Dank marabu, aber es funktioniert noch immer nicht. Folgende Variante funktioniert ebenfalls nicht:


Delphi-Quellcode:
  DBMD5Hash, MD5Hash: String;
  DBUsername, Username: String;
  Q: TADOQuery;
  ...
  {Begin check database for username and password}
  Q := ADOQuery_WebinterfaceUser;
  with Q do
  begin
    Open;
    DBUsername := FieldByName('Username').AsString;
    DBMD5Hash := FieldByName('MD5Hash').AsString;
    Close;
  end;
  ...
  if (DBMD5Hash = MD5Hash) and (DBUsername = Username) then
  begin
    {Begin page load}
  ...
Ich bekomme nur leeres Zeug zurück, obwohl ich zu 100% sicher bin, dass die eingegebenen Daten mit jenen in der Datenbank übereinstimmen.

[Edit]

Natürlich mit folgender SQL-Abfrage:

SQL-Code:
SELECT Username, MD5Hash
FROM WebinterfaceUser
WHERE Username = :Username
AND MD5Hash = :MD5Hash;

marabu 6. Sep 2006 06:08

Re: ADO Suche
 
Guten Morgen.

Zitat:

Zitat von hirnstroem
Ist meine Annahme, dass z.B. :Username eine von mir definierte Variable in Delphi ist, richtig?

Die mit einem Doppelpunkt gekennzeichneten Token sind Parameternamen. Wahrscheinlich hast du die Parameter noch garnicht initialisiert. So könnte es funktionieren:

Delphi-Quellcode:
var
  MD5Hash, UserName: String;
  // ...
begin
  // ...
  with Q do
  begin
    Parameters.ParamValues['Username'] := UserName;
    Parameters.ParamValues['MD5Hash'] := MD5Hash;
    Open;
    DBUsername := FieldByName('Username').AsString;
    DBMD5Hash := FieldByName('MD5Hash').AsString;
    Close;
  end;
  // ...
end;
Freundliche Grüße

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.

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