Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MYSQL Login Script (https://www.delphipraxis.net/145235-mysql-login-script.html)

1carter1 27. Dez 2009 12:46

Datenbank: Mysql • Version: 5.x • Zugriff über: C-Api

MYSQL Login Script
 
Hi,

Ich versuche ein Loginscript zu realisieren, es gibt 2 input felder, eins heißt username das andere Password und dann noch einen Login button, nun hab ich in der datenbank die spalten username und password, diese möchte ich mit der eingabe vergleichen und wenns ne übereinstimmung gibt will ich erstmal nur ne showmessage anzeigen lassen, dass die daten korrekt sind, ich komm leider nicht wirklich weiter, hier ist mal mein ansatz:

Delphi-Quellcode:
 Con := mysql_init(nil);
  if Assigned(Con) then
    try
      if Assigned(mysql_real_connect(Con, host, user, pass, db, 3306, nil, 0)) then
      begin
        query := 'SELECT username,password FROM user WHERE username = '+username.Text+ 'AND password = '+password.text;
        mysql_real_query(Con,PChar(query), Length(query));
         if Assigned(Res) then
         begin
        Res := mysql_store_result(Con);
          if (mysql_num_rows(Res) =1) then showmessage('Daten Korrekt');
          if (mysql_num_rows(Res) <>1) then showmessage('Daten Falsch');
        end;
      end
    finally
      mysql_close(Con);
    end;

fkerber 27. Dez 2009 12:49

Re: MYSQL Login Script
 
Hi!

Klappt dein Code gar nicht (Fehlermeldungen?) oder bekommst du nur nicht, was du haben willst?
Vllt. ist password ein Problem, weil es ein Schlüsselwort ist?

Grüße, Frederic

1carter1 27. Dez 2009 13:02

Re: MYSQL Login Script
 
das wäre ne idee, ich teste es mal eben aus und edite dann

//Edit nein geht auch nicht, wenn ich den namen änder, delphi spuckt ne exception aus, in der aber nicht wirklich was steht, sondern einfach nur adress violation libmysql.dll usw

Sharky 27. Dez 2009 13:05

Re: MYSQL Login Script
 
Hai 1carter1,

einen Fehler sehe ich schon einmal:

Delphi-Quellcode:
  query := 'SELECT username,password FROM user WHERE username = '+username.Text+ 'AND password = '+password.text;
Hier wird AND password direkt an den username gehängt. Ich mache solche Konstruktionen immer über die Delphi-Referenz durchsuchenFormat Funktion. Das ist leichter zu lesen finde ich.
Delphi-Quellcode:
 query := Format('SELECT username,password FROM user WHERE username = %s AND password = %s',[username.Text, password.text]);
Wenn Du den String der SQL-Anweisung jetzt noch als const deklarierst ist der eigentliche Sourcecode noch einfach zu lesen.
Delphi-Quellcode:
const
  UserQuery : string = 'SELECT username,password FROM user WHERE username = %s AND password = %s'
begin
.
.
  query := FORMAT(UserQuery[username.Text, password.text]);
.
.

Phoenix 27. Dez 2009 13:18

Re: MYSQL Login Script
 
Siehe dazu auch: http://xkcd.com/327/

Wir lernen daraus: NIEMALS einen SQL-String selber zusammenbauen. Für so etwas gibt es Parameter.
Bei Deinem Code muss man als Benutzernamen nur
Code:
nix'; DROP TABLE user; --
eingeben und Deine Datenbank ist am allerwertesten.

Matze 27. Dez 2009 13:43

Re: MYSQL Login Script
 
Zitat:

Zitat von Phoenix
Wir lernen daraus: NIEMALS einen SQL-String selber zusammenbauen. Für so etwas gibt es Parameter.

Wenn man die Werte davor überprüft, dann kann man sie auch getrost manuell zusammen setzen (escapen etc.). Das hier im vorliegenden Fall jedoch nicht so.
Aber du hast Recht, mit Parametern ist es schöner.

Sharky 27. Dez 2009 13:48

Re: MYSQL Login Script
 
Ist die Verwendung von Parametern bei seiner LIB denn möglich?

anse 28. Dez 2009 00:47

Re: MYSQL Login Script
 
Zitat:

Zitat von Phoenix
... nur
Code:
nix'; DROP TABLE user; --
eingeben und Deine Datenbank ist am allerwertesten.

Das stimmt nicht, auch wenn es gelegentlich so dargestellt wird - so ein SQL quittiert mysql_real_query() mit einem SQL Fehler, denn man kann nicht so einfach ein SQL Batch als Query abschicken. Wichtig ist einzig das korrekte Escapen von Benutzer-Eingaben.

RWarnecke 28. Dez 2009 01:28

Re: MYSQL Login Script
 
@1carter1:
Hast Du die Datei libmysql.dll in Deinem Windows/System32 oder in Deinem Programmverzeichnis liegen ?

1carter1 28. Dez 2009 12:00

Re: MYSQL Login Script
 
es ist total irrelevant wo die datei liegt, entweder im sys32 oder im programmordner, habs auch schon lange hinbekommen, der query muss so aussehen:

query := 'SELECT username,password FROM user WHERE username = "'+username.Text+ '" AND password = "'+password.text+'"';


mfg carTer

samso 28. Dez 2009 12:08

Re: MYSQL Login Script
 
Zitat:

query := 'SELECT username,password FROM user WHERE username = '+username.Text+ 'AND password = '+password.text;
Anderer Vorschlag:

Delphi-Quellcode:
        query := 'SELECT NULL FROM user WHERE username = ' + QuoteString(username.Text) + 
                 ' AND password = ' +  QuoteString(password.text);
(Falls die aktuelle mysql.pas genutzt wird.)

blawen 28. Dez 2009 13:39

Re: MYSQL Login Script
 
Anderer Vorschlag:
Delphi-Quellcode:
Query.SQL.Text := 'SELECT username,password FROM user WHERE ' +
                  'username = :username AND ' +
                  'password = :password';
 
Query.ParamByName('username').AsString := Username.Text;
Query.ParamByName('password').AsString := Password.Text;
Query.Active := True;
Den Vergleich kannst Du dann einfach über die Rückmeldung machen.
Delphi-Quellcode:
If Query.RecordCount <> 1 
  then...
  else...

PS: Wo führst Du den SQL-Befeh eigentlich aus? (Letzte Zeile im obigen Bsp.)

samso 28. Dez 2009 14:12

Re: MYSQL Login Script
 
@blawen: Geht gar nicht, weil die C-API keine Parameter kennt. Dies geht nur mit dem DB-Zugriff über eine der vielen Delphi-Klassen. Die C-API ist eine Funktionssammlung, die keine Klassen benutzt.

1carter1 28. Dez 2009 14:13

Re: MYSQL Login Script
 
Delphi-Quellcode:
mysql_real_query(Con,PChar(query), Length(query));
hier wird der befehl ausgeführt.

blawen 28. Dez 2009 14:20

Re: MYSQL Login Script
 
Zitat:

Zitat von samso
@blawen: Geht gar nicht, weil die C-API keine Parameter kennt. Dies geht nur mit dem DB-Zugriff über eine der vielen Delphi-Klassen. Die C-API ist eine Funktionssammlung, die keine Klassen benutzt.

OK, Schade eigentlich...

Zitat:

Zitat von 1carter1
mysql_real_query(Con,PChar(query), Length(query));

...aber man lernt eben nie aus :)

Sharky 28. Dez 2009 16:37

Re: MYSQL Login Script
 
Zitat:

Zitat von 1carter1
... habs auch schon lange hinbekommen, ...

Die Höflichkeit gebietet es die anderen zu informieren wenn Du deinen Fehler "gefunden" hast.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz