Entwickler-Ecke

Datenbanken - Datenbank Connect und Daten überprüfen!


DIGIMan - So 19.02.06 13:14
Titel: Datenbank Connect und Daten überprüfen!
Servus,

ich muß gleich dazu sagen das ich neu bin auf den Gebiet und versuche meine erste Abfrage an die Datenbank zusammen zu basteln, ich lerne schnell! Würde mich super freuen wenn mir jemand beim ersten Schritt helfen könnte!

So ich benutze Delphi 6 und will die Datenbank Msql benutzen

Ich benutze folgende Datenbank Komponente die als Anhang dabei ist!

Nun möchte ich an meiner Datenbank Benutzernamen und Passwort abfragen ob diese Korrekt sind!

Was muß ich machen? Beispiele habe ich für die Komponente nicht gefunden!

LG DIGIMan


Blawen - So 19.02.06 13:44
Titel: Re: Datenbank Connect und Daten überprüfen!
Hallo Digiman

Mit Deinem Beispiel kann ich nicht viel anfangen. (um was für eine Komponente handelt es sich ?)

Mit den Zeos-Komponenten kann man die Anmeldung z.B. so umsetzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Try
  with ZConnection do        // ZEOS Verbindungskomponente
    begin
      User     := User;      // z.B. root      (bei allen Übergaben handelt es sich um String-Werte!)
      Password := Passwort;  // z.B. 123456
      HostName := Hostname;  // z.B. localhost
      Port     := Port;      // meist 3306
      Database := DB;        // z.B. meineDB
      Protocol := Protocol;  // z.B. mysql-4.1
      Connect;
      ZQuery1.Active := False;
      ZQuery1.SQL.Text := 'Select * from MITARBEITER';
      ZQuery1.Active := True;
    end;
Except
  ShowMessage('Zur Datenbank konnte nicht verbunden werden.');
end;


Mit anderen Komponenten dürfe es sich gleich/ähnlich verhalten.
Gruss
Blawen


DIGIMan - So 19.02.06 13:51

Meine Komponente ist speziell für Mysql aufgebaut und ich tragen nur die Zugangsdaten ein und schon habe ich eine Verbindung zur Datenbank. Nun suche ich Beispiele wie man Edit1 und Edit2 für Benutzername und Passwort mit der Datenbank abfragt und der Login Button dies ausführt!

Zeos bekomme ich leider nicht installiert!


Blawen - So 19.02.06 13:54

user profile iconDIGIMan hat folgendes geschrieben:
Meine Komponente ist speziell für Mysql aufgebaut und ich tragen nur die Zugangsdaten ein und schon habe ich eine Verbindung zur Datenbank. Nun suche ich Beispiele wie man Edit1 und Edit2 für Benutzername und Passwort mit der Datenbank abfragt und der Login Button dies ausführt!

Zeos bekomme ich leider nicht installiert!


Gehts nur darum: (?)


Delphi-Quelltext
1:
passwort := edit1.Text                    


Zeos:
Welche Delphi Version setzt Du ein?


DIGIMan - So 19.02.06 13:56

Das steht im ersten Beitrag Delphi 6 jetzt muß ich nur die Datenbank abfragen mit select aber wie schaut es aus?


Blawen - So 19.02.06 14:03

user profile iconDIGIMan hat folgendes geschrieben:
Das steht im ersten Beitrag Delphi 6 jetzt muß ich nur die Datenbank abfragen mit select aber wie schaut es aus?


Ich habe u.a. Delphi5, dort lässt sich die neuste Version der Zeos nicht installieren. Mit der ZEOS Version vom 14.11.2005 gehts problemlos (http://sourceforge.net/project/showfiles.php?group_id=35994&package_id=28219)

Es geht also nicht um die eigentliche Verbindung, sondern darum ob der Benutzername und das Passwort übereinstimmen?


Delphi-Quelltext
1:
'Select * from Tabelle WHERE PERSONALNUMMER = ' + Edit1.Text + ' AND PASSWORT = ' + Edit2.Text;                    


Wenn die Ergebnismenge 0 ist, stimmt entweder das Passwort oder der Benutzername nicht.


DIGIMan - So 19.02.06 14:09

Hast du MSN?
Ich würde Dir mal Zugriff auf meinen Rechner geben damit du es dir mal anschauen kann?


Blawen - So 19.02.06 14:14

user profile iconDIGIMan hat folgendes geschrieben:
Hast du MSN?
Ich würde Dir mal Zugriff auf meinen Rechner geben damit du es dir mal anschauen kann?

Habe ich nicht.
Ev. musst Du nur Dein Problem genauer umschreiben?

So verstehen ich es (bisher):
- Der Zugriff zu Datenbank gelingt Dir
- Du möchtest kontrollieren, ob der angemeldete Benutzer (Edit1, Edit2) sich korrekt authorisiert hat


DIGIMan - So 19.02.06 14:21

Du hast es genau erfasst!

Ich habe das Feld: Benutzername und Passwort und nun soll der Button Login die abfragen und Label2 soll dann bei falscher Eingabe folgende ausgeben: Zugangsdaten nicht korrekt!

Wie schaut es nun aus?

Ich habe Zweit Komponenten in mein Formunlar hinzugefügt:

MyDatabase1
MyDataSet1


DIGIMan - So 19.02.06 14:28

Hier ein Screenshot von meinem Rechner!


Blawen - So 19.02.06 14:33

user profile iconDIGIMan hat folgendes geschrieben:
Du hast es genau erfasst!

Ich habe das Feld: Benutzername und Passwort und nun soll der Button Login die abfragen und Label2 soll dann bei falscher Eingabe folgende ausgeben: Zugangsdaten nicht korrekt!

Wie schaut es nun aus?

Ich habe Zweit Komponenten in mein Formunlar hinzugefügt:

MyDatabase1
MyDataSet1


Handelt es sich bei der Komponente umd MySQL direkt -> wenn ja gibts dazu ein Tutorial: http://www.dsdt.info/tutorials/mysqldirect/

Ansonsten:
Obiger Weg sollte grundsätzlich gehen:

- Einen Select String mit den Bedingungen Edit1 und Edit2 generieren

Delphi-Quelltext
1:
'Select * from Tabelle WHERE ' + Edit1.Text + ' = ' + Edit2.Text;                    


- die zurückgelieferte Datenmenge kontrollieren. Wenn es keine Übereinstimmung gibt, sind die eingegeben Daten falsch

Sinngemässes Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TForm1.LoginClick(Sender : TObject)
begin
  Query.Active := False;
  Query.SQL.Text := 'Select * from Mitarbeiter WHERE Personalnummer = ' + Edit1.Text + ' AND Passwort = ' + Edit2.Text;  
  //z.B. 'Select * from Mitarbeiter WHERE Personalnummer = 1000 AND Passwort = 1234'
  Query.Active := True;

  IF Query.EOF THEN .... // Kein Benutzer vorhanden
end;


DIGIMan - So 19.02.06 14:48

Das ist schon mal super und ich werde es gleich mal testen....


DIGIMan - So 19.02.06 15:01

Ich habe das mal so eingabaut:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select * from users WHERE username = ' + Username.Text + ' AND passwort = ' + Passwort.Text;
  //z.B. 'Select * from Mitarbeiter WHERE Personalnummer = 1000 AND Passwort = 1234'  
  MyDataSet1.Active := True;

 
  IF MyDataSet1.EOF THEN  // Kein Benutzer vorhanden


Ich bekomme folgenden Fehler:

Im Project Surfbar.exe ist eine Exception der Klasse EDatabaseError aufgetreten.
Meldung: 'own column'webmaster' in 'where clause'

Was habe ich falsch gemacht?

Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt


Blawen - So 19.02.06 15:21

user profile iconDIGIMan hat folgendes geschrieben:
Ich bekomme folgenden Fehler:

Im Project Surfbar.exe ist eine Exception der Klasse EDatabaseError aufgetreten.
Meldung: 'own column'webmaster' in 'where clause'

Was habe ich falsch gemacht?
Stimmen die Angaben im SQL-String mit den Feldnamen überein?


DIGIMan - So 19.02.06 15:29

Ich muß es so machen, da ich die UserID in Form2 mit übergeben will!
Also müssen wir per IF-Schleife schauen ob die Daten korrekt sind!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.LoginClick(Sender: TObject);
begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ';
  MyDataSet1.Active := True;


  IF MyDataSet1.EOF THEN begin // Kein Benutzer vorhanden
        ShowMessage('
Benutzerdaten sind nicht korrekt');
        else
        Form1.Hide;
        Form2.Show;

  end;

end;


Das bedeute die Augabe der Daten muß noch kommen und dann IF umändern aber wie?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


Blawen - So 19.02.06 15:43

user profile iconDIGIMan hat folgendes geschrieben:
Ich muß es so machen, da ich die UserID in Form2 mit übergeben will!
Also müssen wir per IF-Schleife schauen ob die Daten korrekt sind!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.LoginClick(Sender: TObject);
begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ';
  MyDataSet1.Active := True;

  IF MyDataSet1.EOF THEN begin // Kein Benutzer vorhanden
        ShowMessage('
Benutzerdaten sind nicht korrekt');
        else
        Form1.Hide;
        Form2.Show;
  end;
end;


Das bedeute die Augabe der Daten muß noch kommen und dann IF umändern aber wie?


??? Wieso so kompliziert?

Wie wäre es mit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.LoginClick(Sender: TObject);
begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ' AND Passwort = ' + Passwort;
  MyDataSet1.Active := True;


  IF MyDataSet1.EOF 
  THEN // Kein Benutzer vorhanden
    ShowMessage('Benutzerdaten sind nicht korrekt');
  ELSE 
    begin  //theoretisch darf es nur einen User/Benutzer geben, wie gewünscht eine Unterabfrage
      IF Query.FieldByName('PASSWORT').AsString = Passwort
      THEN
        begin
          ID := Query.FieldByName('ID').AsInteger;
          Form1.Hide;
          Form2.Show;
        end;
    end;
end;



Ich persönlich würde es so lösen (da der User eindeutig sein muss -> kein 2. User mir dem gleichen Usernamen)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.LoginClick(Sender: TObject);
begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ' AND Passwort = ' + Passwort;
  MyDataSet1.Active := True;


  IF NOT MyDataSet1.EOF 
  THEN    
    begin
      ID := Query.FieldByName('ID').AsInteger;
      Form1.Hide;
      Form2.Show;
    end;
  ELSE ShowMessage('Benutzerdaten sind nicht korrekt');

end;


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


DIGIMan - So 19.02.06 15:56

Außer einige Fehler habe ich das jetzt so übernommen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.LoginClick(Sender: TObject);
begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ' AND passwort = ' + Passwort.Text;
  MyDataSet1.Active := True;

  IF NOT MyDataSet1.EOF
  THEN
    begin
      UserID := MyDataSet1.FieldByName('id').AsInteger;
      Form1.Hide;
      Form2.Show;
    end;
  ELSE ShowMessage('Benutzerdaten sind nicht korrekt');

end;


Aber ich bekomme nun folgende Fehler:


Delphi-Quelltext
1:
2:
3:
[Fehler] surfbar1.pas(59): Undefinierter Bezeichner: 'UserID'
[Fehler] surfbar1.pas(63): ';' nicht erlaubt vor einem 'ELSE'
[Fataler Fehler] Surfbar.dpr(7): Verwendete Unit 'surfbar1.pas' kann nicht compiliert werden


Was muß ich noch machen?

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


Blawen - So 19.02.06 16:01

Zitat:

Was muß ich noch machen?


Sorry, mein Fehler:

';' nicht erlaubt
-> ; vor dem end wegnehmen:

so müsste es aussehen:

Delphi-Quelltext
1:
2:
3:
     Form2.Show;
    end
  ELSE ShowMessage('Benutzerdaten sind nicht korrekt');


UserID
Die UserID habe ich als Integer angenommen (Sorry, die Deklaration habe ich unterschlagen -> var UserID : Integer)
(Im ersten Beispiel nannte ich es nur ID - Soorry)

Es ging mir nur darum, aufzuzeigen wie die ID des Datensatzes ermittelt werden kann.
Die weitere Verarbeitung der ID hängt vom konkreten Projekt ab.


DIGIMan - So 19.02.06 16:08

UserID:

Er kennt die var nicht, muß die nicht erst definiert werden, damit er sie benutzen kann?

[Fehler] surfbar1.pas(59): Undefinierter Bezeichner: 'UserID'


Blawen - So 19.02.06 16:15

user profile iconDIGIMan hat folgendes geschrieben:
UserID:

Er kennt die var nicht, muß die nicht erst definiert werden, damit er sie benutzen kann?

[Fehler] surfbar1.pas(59): Undefinierter Bezeichner: 'UserID'


Eigentlich schon!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.LoginClick(Sender: TObject);  
var 
  UserID : Integer;

begin  
  MyDataSet1.Active := False;  
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ' AND Passwort = ' + Passwort;  
  MyDataSet1.Active := True;  

  IF NOT MyDataSet1.EOF   
  THEN      
    begin  
      ID := Query.FieldByName('ID').AsInteger;  
      Form1.Hide;  
      Form2.Show;  
    end
  ELSE ShowMessage('Benutzerdaten sind nicht korrekt');  
end;


Wie geschrieben, es ging mir im Beispiel darum, wie Du zur ID des aktuellen Datensatzes gelangst.
Was Du damit aber machen willst, ist bisher nicht definiert (Globale Variable, Parameter-Übergabe,... ?)
Somit ist je nach Vorgehen der Definitionsort der UserID unterschiedlich.


DIGIMan - So 19.02.06 16:17

So das Compilieren hat funktioniert aber wenn ich auf login klicke kommt
folgender Fehler: schaue Screenshot


DIGIMan - So 19.02.06 16:33

Mit der Datenbank error im Vorigen Beitag bin ich noch nicht weiter gekommen!

das soll mit der UserID passieren:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.LoginClick(Sender: TObject);
var
  UserID : Integer;
  LoginTime : Integer;

begin
  MyDataSet1.Active := False;
  MyDataSet1.SQL.Text := 'Select id,username,passwort from users WHERE username = ' + Username.Text + ' AND passwort = ' + Passwort.Text;
  MyDataSet1.Active := True;

  IF NOT MyDataSet1.EOF
  THEN
    begin
      UserID := MyDataSet1.FieldByName('id').AsInteger;
      LoginTime :=  ; //??? Aktuelle Zeit in Sekunden
      MyDataSet1.Active := False;
      MyDataSet1.SQL.Text := 'Insert from stats set userID = ' + UserID + ', login = ' + LoginTime;
      MyDataSet1.Active := True;

      Form1.Hide;
      Form2.Show;
    end
  ELSE ShowMessage('Benutzerdaten sind nicht korrekt');

end;


Es soll in der Datenbank stats einen Eintrag folgenden, wenn der User sich eingetroggt hat!

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt


Blawen - So 19.02.06 16:34

user profile iconDIGIMan hat folgendes geschrieben:
So das Compilieren hat funktioniert aber wenn ich auf login klicke kommt
folgender Fehler: schaue Screenshot

Die Fehlermeldung sagt: Fehler in der SQL-Syntax.

Ändere mal wie folgt:

Delphi-Quelltext
1:
'Select id,username,passwort from users WHERE username = "' + Username.Text + '" AND Passwort = "' + Passwort.Text + '"'                    


(mann beachte die " !


Blawen - So 19.02.06 16:42

Zeit: Soll wirklich nur die Zeit eruiert werden? Datum?

Aus der Delphi-Hilfe:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Timer1Timer(Sender: TObject);

var
  DateTime : TDateTime;
  str : string;
begin
  DateTime := Time;  // aktuelle Uhrzeit und Datum speichern
  str := TimeToStr(DateTime); // Uhrzeit in einen String konvertieren
  Caption := str;  // Uhrzeit in der Titelleiste des Formulars anzeigen
  { Hinweis: Dies hätte auch mit der folgenden Programmzeile ausgeführt werden können:
    Caption := TimeToStr(Time); }

end;


Als Beispiel soll im Edit1-Feld die aktuelle Zeit ausgegeben werden:


Delphi-Quelltext
1:
 Edit1.Text := TimeToStr(Time);                    


Moderiert von user profile iconraziel: Quote- durch Delphi-Tags ersetzt


DIGIMan - So 19.02.06 16:48

>Fehlt da nicht ein and zwische username und passwort?

Ich habe beides ausprobiert, aber es klappt einfach nicht :(


Blawen - So 19.02.06 16:49

user profile iconDIGIMan hat folgendes geschrieben:
>Fehlt da nicht ein and zwische username und passwort?

Ich habe beides ausprobiert, aber es klappt einfach nicht :(

Selbstverständlich hast Du recht, irgendwie habe ich dies unterschlagen...


Delphi-Quelltext
1:
'Select id,username,passwort from users WHERE username = "' + Username.Text + '" AND Passwort = "' + Passwort.Text + '"'                    


DIGIMan - So 19.02.06 16:56

hast du einen Messenger?
Das geht schneller und einfacher!
Ich würde dir mal das script schicken, damit du es dir anschauen kannst und es selber testes!


Blawen - So 19.02.06 17:02

user profile iconDIGIMan hat folgendes geschrieben:
hast du einen Messenger?
Das geht schneller und einfacher!
Ich würde dir mal das script schicken, damit du es dir anschauen kannst und es selber testes!


Messenger: Im Prinzip schon, allerdings müsste ich auch die gleiche Entwicklungsumgebung haben...

Kannst Du den fertigen String nicht mal Testweise ausschreiben?

Delphi-Quelltext
1:
'Select id,username,passwort from users WHERE username = "Hans" AND Passwort = "1234"'                    


Alternativ kannst Du ja auch einen SQL-Manager zum testen der SQL-Strings einsetzen (zb von hier http://sqlmanager.net/de/products/mysql/manager/download (kostenlose Light Version)


Blawen - So 19.02.06 17:05

Eine weitere Möglichkeit gibt es noch:

Ev. müssen die Feldnamen GROSS geschrieben werden.


Delphi-Quelltext
1:
'Select ID,USERNAME,PASSWORT from USERS WHERE USERNAME = "Hans" AND PASSWORT = "1234"'                    


DIGIMan - So 19.02.06 17:08

Es ist eine MySQL Datenbank und dort muß auf groß und kleinschreibung geachtet werden, wie bei PHP!



Du brauchst ja nur die Komponente die im ersten Beitrag ist installieren und dann mein Script!

Welchen Messanger benutzt du? Und wie ist der Username oder Email?

Ich habe in mein Form die Komponente: MyDataSet1

Abfrage startet ja mit: MyDataSet1.SQL.Text

Was bedeutet denn SQL habe ich auch im Inspektor drin, aber TEXT woher?


Blawen - So 19.02.06 17:20

Die Komponente habe ich mir mal installiert.
Kannst Du mir Deinen kompletten Source + die Datenbank-Struktur per PN senden?
Ich werde es mir anschauen


Blawen - So 19.02.06 19:58

Rückmeldung an die übrigen Leser:

Es war die Komponente...
Mit den ZEOS-Komponenten gehts wunschgemäss