2012-04-01 9 views
1

は最近だけで、セキュリティ上の理由のために準備された文にSQLで私の文を変更して、ここで私が思い付いたものです。..準備文のエラー

残念ながら、それはを考え出すのは

"SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 
にエラー
を見つけることができません

全体のエラー:

見つけることができませんシンボル: シンボル:メソッドのprepareStatement(java.lang.Stringで) 場所:私はそれはそれはPreparedStatementのあるべき時に文字列を見つけることだと実感が、これは、私はいつも、私はおそらくばかげた何かをやっている

例などでそれを見る方法です

型HolidayExchange.DBAccessの変数dbAccessのこれを解決する助けが本当に役に立ちます!

全体方法:

DBACCESS dbAccessの=新しい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

DBAccesの完全なパッケージ名は何ですか? javadocが "prepareStatement"をサポートしているかどうかを確認します。 – Glenn

+0

public DBAccess()はServletExceptionをスローします。{ this.getConnection(); } – Jimmy

+0

これは、getconnection()メソッドを参照しています。これはデータベースとの接続を取得し、100%動作します。 – Jimmy

答えて

2

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

が欠落した空間が彼らの周りに単一引用符を入れてみてください各疑問符について

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

おっと、ちょっと馬鹿だった。主な問題は、互換性のないタイプのエラーです – Jimmy

+0

また、間違った順序でユーザー名とパスワードをバインドしているようです。ステートメントの最後にセミコロンが必要だとは思わないでください。 – Glenn

+0

[OK]をこれをソートしました。しかし、なぜ私はそのエラーを取得しているすべてのアイデア、? – Jimmy

-1

する必要がありますがあります。

'?' 
+0

本当ですか?すでにバインドタイプを指定した後で、サーバーに暗黙のキャストを要求することはありませんか?私がやることだとは思わないでください。それとも私はここで何かを逃している。 – Glenn

+0

私はGlenに同意します。かなり必要ではありません。 ' – Jimmy

0

クエリを実行する前に、必ずps.toString()を記録してください。これにより、実際に実行されたクエリをプログラマに知らせることができます。

また、PreparedStatementは文字列ではありません。

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

+0

私のDBaccessクラスはすべてのDB接続を処理します。新しいコードを貼り付けて、あなたの考えを見てみましょう。 – Jimmy

+0

新しいコードを貼り付けました。 – Jimmy

0

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

このエラーメッセージには、不正な形式のSQLには何も表示されません。これはコンパイル時エラーです。 HolidayExchange.DBAccessクラスには、引数としてjava.lang.StringをとるprepareStatementという名前のメソッドはありません。

SQLはコンパイル時に検証されないため、コンパイル時にエラーが発生することはありません。コンパイルすると、疑問符のまわりにある一重引用符を削除すると、クエリが正常に動作することがわかります。

+0

私のDBアクセスクラスにこのメソッドがあります: 'code' public ResultSet executeQuery2(PreparedStatement ps)throws SQLException {try { return ps.executeQuery(); } catch(SQLException e){throw e; }} 'code'私はprepareStatementメソッドがPreparedStatementパッケージのメソッドであると仮定しました。正直です。 – Jimmy

+0

また、このメソッドを記述すると、それを処理しようとしています.. public ResultSet executeQuery2(PreparedStatement ps)throw SQLException { { return ps.executeQuery(); } catch(SQLException e){ throw e; } } これらを呼び出してPreparedStatementを使用する必要がありますか? – Jimmy

+0

したがってPreparedStatementを返すprepareStatementという名前のメソッドがなく、文字列を引数として取ります。さらに、PreparedStatementはパッケージではなく、インタフェースです。 –

0

インポートを持っている場合com.mysq.jdbc.*;それを削除し、私はそれがどちらか使用しているのPreparedStatementメソッドを使用すると、接続しているデータベースに適していないということだと思うだって、それ故にその逆 輸入java.sql.PreparedStatement;に変更します。