2017-08-19 6 views
-2

私のJavaプログラムでSQL文を実行できない理由はまだわかりませんでしたが、ワークベンチ!SEVERE:null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 'where句'の 'Admin'列が不明です

ユーザーが登録またはログインできるインターフェイスを作成しようとしています。登録するには 、私はこのエラーがあります:

SEVERE: null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'Admin' in 'field list'

私はクリアボタンをクリックすると、タイプがOKなら、私はそれがない。また、私はワークベンチ

で見ることができるデータベースにユーザ名「admin」を持っています文字列が空でelseブロックを実行しているので、登録のエラーを出さず、コードを登録しようとする部分をスキップするので、データのテーブルを見ることができます。

(MyUserAppクラスのコード)

private void RegisterButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    String username, password, address, dob; 
    try { 
     // TODO Register very important too! 
     username = newUsernameField.getText(); 
     password = passwordField2.getText(); 
     address = addressField.getText(); 
     dob = dateofbField.getText(); 
if(username == null || password == null || username.isEmpty() || password.isEmpty() || password.length() < 6) 
      jLabel6.setText("The information you typed in is not valid. "); 
     else{ 
       this.app.registerUser(app, username, password, dob, address); 

       } 
     String u = this.app.showDB(app); 
     showTableDB.setText(u); 
    } catch (SQLException ex) { 
     Logger.getLogger(UserAppUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 
}     

(UIクラスのコード)

public void registerUser(MyUserApp app, String username, String pw, String dob, String address) throws SQLException{ 

    String sb = "INSERT INTO javabase.user (iduser, username, password, date_of_birth, address)\n VALUES (" + app.incID()+", "+username+", "+pw+", "+dob+", "+address +");"; 
    PreparedStatement statement = app.getCon().prepareStatement(sb); 
    statement.execute(); 
} 

私は https://prnt.sc/gajpns

にログインしようとすると、私がしようとすると、この問題が発生した場合に、この問題が発生しました登録する: https://prnt.sc/gak3uh

ユーザーがログインするコードは、基本的にこれです:この1を呼び出すUIクラス、上

this.app.login(this.app, username, pw); 

public void login(MyUserApp app, String user, String pw) throws SQLException{ 

    String sql = "SELECT * FROM javabase.user WHERE username = "+ user +" and password = "+pw+";"; 
    PreparedStatement statement = app.getCon().prepareStatement(sql); 
    statement.execute(); 
} 
+0

を使用するには、クエリパラメータを使用することを学びます。クエリ文字列をマージしないでください。そうすると、このようなデバッグの難しい問題が発生する可能性があります。 –

+0

どういう意味ですか? +と文字列の連結? –

+0

私はstringbuilderを前にやっていましたが、うまくいきませんでした。そして、文字列全体を処理して、エラーが何かを確認しました。なぜなら、私はコマンドをワークベンチに置くと動作します...しかし、なぜか、前もってありがとう –

答えて

0

あなたは文字列リテラルを囲む必要があり、そのようなユーザの名前として、あるいはパスワードは、mysqlの一重引用符または二重引用符で囲みます。そうしないと、mysqlはそれらをカラム名として解析します。

String sql = "SELECT * FROM javabase.user WHERE username = '"+ user +"' and password = '"+pw+"';"; 

上記の解決策に沿って他のすべての文を編集する必要があります。

しかし、plsはGordonのアドバイスと使用パラメータを考慮し、文字列連結は考慮しません。

+0

ありがとう! –

+0

私はストリングビルダーを使用していましたが、私は何をするべきか分からず、問題を分離するためにさまざまなことを試し続けています...私は引用符については打ちのめすが、忘れてしまった私はこれまでにXDをどうやってやることができたのですか愚かなことありがとう!私は問題がSQL文にあるべきだと知っていました:) –

-2

私はSQLパラメータ

public boolean registerUser(MyUserApp app, String username, String pw, String dob, String address) throws SQLException{ 

    String sb = "INSERT INTO user (iduser, username, password, date_of_birth, address)\n VALUES (?, ?, ?, ?, ?);"; 
    PreparedStatement statement = app.getCon().prepareStatement(sb); 
    statement.setInt(1, app.incID()); 
    statement.setString(2, username); 
    statement.setString(3, cryptWithMD5(pw)); 
    statement.setString(4,dob); 
    statement.setString(5,address); 

    boolean status = statement.execute(); 
    return status; 

    } 
+0

MD5のようなハッシュ関数を使ってパスワードベリファイアを保存するだけでは不十分で、単にsaltを追加するだけでセキュリティが向上しません。 – zaph

+0

@zaphはSQLインジェクションに関しては十分ですか?パスワードは、私が何をすればいいですか?別のハッシュを使用しますか?私の心配は、それがデータベースとそのvarchar25に適合しなければならないということです。 –

+0

@zaphあなたは大文字を持っているか、少なくとも6の長さである場合、ユーザからの入力を検証することを意味しますか?私が6レングテストに登録しても、あなたが意味するもののヒントを教えてもらえますか? :) –

関連する問題