SEVERE: null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 未知列 'Admin' in 'where cla



我仍然无法找出为什么我的SQL语句不能在我的JAVA程序上运行,但它们可以在Workbench上运行!

我正在尝试制作一个用户可以注册或登录的界面。 要注册,我有此错误:

SEVERE:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 未知列 'Admin' in 'field list'

我在数据库上有一个用户名"管理员",我可以在工作台上看到

此外,如果我单击按钮清除并键入确定,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册代码的部分,因为字符串为空并运行 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

让用户登录的代码基本上是这样的:

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

在 UI 类上,调用这个:

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();
}

您必须在 mysql 中用单引号或双引号将字符串文字(例如用户名或密码(括起来。如果你不这样做,那么mysql会将它们解析为列名。

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

您必须根据我上面提供的解决方案编辑所有其他语句。

但是,请考虑 Gordon 的建议并使用参数而不是字符串连接。

我使用了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;
}