Zum Inhalt springen

Probleme bei Datenbank Abfrage


Gateway_man

Empfohlene Beiträge

Guten Morgen,

folgendes Problem besteht:

Ich habe eine MySQL Datenbank in der eine Tabelle User existiert.

Diese verfügt unter anderem über die Spalten Username und Password.

Jetzt hatte ich mir eine Funktion in Java geschrieben, die überprüfen soll ob ein solcher Useraccount existiert.

Siehe hier:


public boolean Authenticate(String User,String Pass){

	boolean lresult = false;

if(!(User==null && Pass==null)){

	try {

		Statement cmd = con.createStatement();

		ResultSet ada;

		ada = cmd.executeQuery("Select count(*) From ems.tbl_user Where Username='" + User + "' AND Password='" + Pass + "'");

		int response = 0;

		while(ada.next()){

              System.out.println(ada.getObject(1).toString());

		}

		if (response>0){

			lresult=true;

			this.User = User;

			this.Pass = Pass;

			bAuth = true;

		}

	} catch (SQLException e) {

		e.printStackTrace();

	}

	}

	return lresult;

}

Egal wie ich es drehe und wende der Loop des ResultSets liefert mir immer als Count Ergebniss 0. Wenn ich aber in meine mysql console gehe und selbiges Statement mit selbigen User-Login-Daten ausführe, dann erhalte ich als Count Ergebniss 1.

Ich bin mit meinem Latein am Ende.

Wenn jemand was sieht wäre ich sehr erfreut.

PS:

An der SQL-Connection kanns nicht liegen, da er nicht in den Catch Block springt.

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erst einmal würde ich Prepare Statements verwenden, das ist sicherer.

Du brauchst auch kein while next, denn nach der Definition steht nach einer Query der Zeiger vor dem ersten ersten Datensatz, d.h. ein einfaches


if (ada.next)

reich aus.

Weiterhin liefert count(*) einen numerischen Typ (int) und kein Objekt oder String

Außerdem würde ich hier nicht via Count prüfen, sondern auf die Existentz des Datensatzes.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke,

ich hatte bereits getInt(columindex), allerdings hatte er mir dann auch 0 zurückgegeben, dann wollte ich es eben mal anders versuchen :).

Ich prüfe doch auf Existens.

Ich gebe die Filterfunktionen an und wenn ein Datensatz vorhanden ist dann existiert der User. (Wohl gemerkt ist das so geregelt das jeder Username eindeutig ist).

Ich glauble zwar nicht das es nur am while Konstrukt liegt aber ich werds mal ändern.

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay das hat sich erledigt.

Das Password das übergeben wurde, stammt von einem JPasswordField.

Was mich etwas verwundet ist, das die Property getPassword mir kryptische Zeichen zurückgibt. Jetzt nutze ich getText (und ja ich weiß das es Obsolet ist aber wenns nicht funktioniert...).

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das was ich oben gemacht habe war ja nur zu testzwecken.

So hatte ich es vorher:


public boolean Authenticate(String User,String Pass){

	boolean lresult = false;

if(!(User==null && Pass==null)){

	try {

		Statement cmd = con.createStatement();

		ResultSet ada;

		ada = cmd.executeQuery("Select count(*) From ems.tbl_user Where Username='" + User + "' AND Password='" + Pass + "'");

		int response = 0;

		while(ada.next()){

                          response=ada.getInt(1);

		}

		if (response>0){

			lresult=true;

			this.User = User;

			this.Pass = Pass;

			bAuth = true;

		}

	} catch (SQLException e) {

		e.printStackTrace();

	}

	}

	return lresult;

}

Count liefert immer eine Row zurück deswegen prüfe ich ja auch den Wert des Counts. Wenn dieser größer als null ist, dann existiert der User....

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vielen Dank.

Das Resultat sieht jetzt wie folgt aus:


public boolean Authenticate(String User,String Pass){

	boolean lresult = false;

if(!(User==null && Pass==null)){

	try {

		Statement cmd = con.createStatement();

		ResultSet ada;

		ada = cmd.executeQuery("Select * From ems.tbl_user Where Username='" + User + "' AND Password='" + Pass + "'");

		if(ada.next()){

                        UID = ada.getInt(1);

			lresult=true;

			this.User = User;

			this.Pass = Pass;

			bAuth = true;

		}

	} catch (SQLException e) {

		e.printStackTrace();

	}

	}

	return lresult;

}

lg

Gateway

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt noch ein PrepareStatement, dann finde ich es perfekt.... :P

Naja das Teil ist weit davon entfernt perfekt zu sein:

1. Fehlerbehandlung. Der Aufrufer kriegt davon nichts mit und es wird einfach weitergemacht, des weiteren verschwindet die Meldung einfach auf der Konsole. Eine "perfekte" Methode würde das via Log4J wegschreiben.

2. Ressourcen werden nicht im finally Block freigegeben. Je nach Implementierung des JDBC Treibers kann das dann irgendwann zu Problemen führen, vor allem, wenn an anderer Stelle auch so schludrig mit DB-Ressourcen umgegangen wird.

3. Bei einer reinen Existenzprüfung sollte immer ein COUNT verwendet werden anstatt den kompletten Datensatz zurückzuliefern. Das ist deutlich performanter. Insb. wenn auf die Maschine mal Last kommen sollte, wirkt sich das positiv aus. Die while Schleife kann man sich in diesem Fall auch sparen.

Das PrepStatement wurde ja schon erwähnt.

Als weitere Verbesserung wäre noch anzubringen, dass Methoden und Variablennamen im allgemeinen mit einem Kleinbuchstaben beginnen.

Dim

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...