2012-04-01 5 views
1

Kürzlich gerade meine Aussagen in SQL vorbereiteten Anweisungen aus Sicherheitsgründen geändert, und hier ist es, was ich mit ..Prepared Statement Fehler

kam leider mit einem kommen, es ist nicht Fehler auf die

"SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 
finden

Der gesamte Fehler:

nicht Symbol gefunden: Symbol: Methode prepareStatement (java.lang.String) Lage: variable DbAccess vom Typ HolidayExchange.DBAccess

ich erkennen, dass es einen String zu finden, wenn es ein PreparedStatement sein sollte, aber das ist, wie ich sehe es immer in den Beispielen usw.

ich wahrscheinlich idiotisch etwas zu tun, bin aber jede Hilfe, die das löst, wäre sehr hilfreich!

Die gesamte Methode:

DBAccess DbAccess = new DBAccess();

 String sql = "SELECT * FROM owner WHERE username = '?' AND"+ 
       " password = '?'"; 

     PreparedStatement ps = dbAccess.prepareStatement(sql); 

     ps.setString(1,u); 
     ps.setString(2,p); 

     ResultSet rs = dbAccess.executeQuery2(ps); 
     User user = new User(); 
     while (rs.next()){ 
      user.setFirstname(rs.getString("firstname")); 
      user.setSurname(rs.getString("surname")); 
      user.setUsername(rs.getString("username")); 
      user.setPassword(rs.getString("password")); 
     } 

     rs.close(); 
     dbAccess.close(); 

     if(user.getUsername().length()==0){ 
      return null; 
     }else{ 
      return user; 
     } 
    } catch (Exception e) { 
     return null; 
    } 
}` 
+0

Wie lautet der vollständige Paketname von DBAcces? Überprüfen Sie, ob das Javadoc anzeigt, ob es "prepareStatement" unterstützt. – Glenn

+0

public DBAccess() löst ServletException { this.getConnection(); } – Jimmy

+0

Was verweist die getconnection() -Methode, die nur die Verbindung zur Datenbank und 100% funktioniert. – Jimmy

Antwort

2

Es gibt einen Raum

 // becomes ANDpassword in the resulting string: 
    "SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

sollte um sie für jede Fragezeichen

 // space added before passsword: 
    "SELECT * FROM owner WHERE username = ? AND" + " password = ?;"; 
+0

oops, danke dafür war ein bisschen dumm. Obwohl das Hauptproblem ist die inkompatible Typen Fehler – Jimmy

+0

Auch sieht aus wie Sie den Benutzernamen und das Passwort in der falschen Reihenfolge verbindlich sind. Denken Sie nicht, dass das Semikolon am Ende der Aussage auch notwendig ist. – Glenn

+0

Ok sortiert das. Irgendeine Idee, warum ich diesen Fehler bekomme? – Jimmy

-1

fehlen versuchen setzen einfache Anführungszeichen.

+0

Wirklich? Würden Sie den Server nicht dazu auffordern, implizites Casting durchzuführen, nachdem Sie die Bindungstypen bereits angegeben haben? Denke nicht, dass ich etwas tun würde. Oder ich vermisse etwas hier. – Glenn

+0

Ich stimme Glen zu, ziemlich sicher, dass Sie nicht brauchen – Jimmy

0

Melden Sie immer ps.toString(), bevor Sie eine Abfrage ausführen. Dadurch weiß der Programmierer, welche Abfrage tatsächlich ausgeführt wurde.

Auch PreparedStatement sind keine Strings

Verbindung con = null; Class.forName ("com.mysql.jdbc.Driver"); con = DriverManager.getConnection ("jdbc: mysql: localhost: 3306/jdbctutorial", "root", "root"); PrepareStatement ps = con.prepareStatement (sqlQuery);

+0

Meine DBaccess-Klasse behandelt alle DB-Verbindungen. Ich füge den neuen Code ein, um zu sehen, was du denkst. Ich bekomme immer noch eine Fehlermeldung, dass es kein Symbol finden kann, obwohl – Jimmy

+0

den neuen Code in .. – Jimmy

0

Cannot find symbol: symbol: method prepareStatement(java.lang.String) location: variable dbAccess of type HolidayExchange.DBAccess

Diese Fehlermeldung hat nichts mit schlecht formatierten SQL zu punktieren. Es ist ein Kompilierzeitfehler. Die Klasse HolidayExchange.DBAccess verfügt nicht über die Methode prepareStatement, die java.lang.String als Argument verwendet.

Ihr SQL wird in der Kompilierzeit nicht überprüft (oder ausgewertet), daher kann es kein Grund für Kompilierzeitfehler sein. Sobald Sie es zu kompilieren bekommen, werden Sie wahrscheinlich feststellen, dass Ihre Abfrage gut funktioniert, nachdem Sie einfache Anführungszeichen entfernt haben, die sich um Fragezeichen befinden.

+0

eingefügt Ok, ich habe diese Methode in meiner DB-Zugriffsklasse: 'code' public ResultSet executeQuery2 (PreparedStatement ps) löst SQLException {try { Zurückgeben von ps.executeQuery(); } catch (SQLException e) {wirf e; }} 'code' Ich habe gerade angenommen, prepareStatement war eine Methode im PreparedStatement-Paket, um ehrlich zu sein. – Jimmy

+0

Schrieb auch diese Methode, um damit umzugehen. Public ResultSet executeQuery2 (PreparedStatement ps) löst SQLException aus { try { return ps.executeQuery(); } catch (SQLException e) { werfen e; } } Sollte ich diese aufrufen, um die PreparedStatement zu verwenden? – Jimmy

+0

Sie haben also keine Methode namens prepareStatement, die PreparedStatement zurückgibt und String als Argument verwendet. Darüber hinaus ist PreparedStatement kein Paket, es ist eine Schnittstelle. –

0

wenn Sie den Import haben com.mysq.jdbc.*; es zu entfernen und es java.sql.PreparedStatement; daher umgekehrt Import ändern, Coz Ich glaube, dass es entweder die PreparedStatement-Methode, die Sie verwenden für die Datenbank nicht geeignet ist, die Verbindung hergestellt wird.