Java 严重:null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列';管理员';在';其中第'条;
我仍然无法找到为什么我的SQL语句不能在我的JAVA程序上运行,但它们是在工作台上运行的 我正在尝试制作一个用户可以注册或登录的界面。 要注册,我有以下错误: 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:字段列表中的未知列“Admin” 我在数据库中有一个用户名“Admin”,可以在workbench上看到 另外,如果我点击Clear按钮并键入OK,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册代码的部分,因为字符串是空的,并且运行else块 (MyUserApp类上的代码) 当我尝试登录时会发生这种情况 当我尝试注册时会发生这种情况: 让用户登录的代码基本上如下所示:Java 严重:null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列';管理员';在';其中第'条;,java,mysql,sql,jdbc,Java,Mysql,Sql,Jdbc,我仍然无法找到为什么我的SQL语句不能在我的JAVA程序上运行,但它们是在工作台上运行的 我正在尝试制作一个用户可以注册或登录的界面。 要注册,我有以下错误: 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:字段列表中的未知列“Admin” 我在数据库中有一个用户名“Admin”,可以在workbench上看到 另外,如果我点击Clear按钮并键入OK,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册
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+"';";
您必须按照我上面提供的解决方案编辑所有其他语句
但是,请考虑戈登的建议和使用参数,而不是字符串连接。
< P>我使用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;
}
学习使用查询参数。不要咀嚼查询字符串。当你这样做的时候,你很可能会遇到难以调试的问题,比如这个问题。你是什么意思?字符串与+?我以前做过stringbuilder,但它不起作用,然后我回来做整个字符串,看看是什么错误,因为当我把命令放在工作台上时,它起作用了。。。但在这里它不。。。不知道为什么,提前谢谢现在请检查我的答案,并告诉我它是否好并且不受sQL注入的影响,谢谢@GordonLinoff仅使用哈希函数保存密码验证器是不够的,仅添加一个salt对提高安全性几乎没有作用。相反,使用随机盐在HMAC上迭代大约100ms,并使用散列保存盐。使用函数,如
PBKDF2
,Rfc2898DeriveBytes
,password\u hash
,Bcrypt
,passlib.hash
或类似函数。关键是让攻击者花费大量时间用暴力寻找密码。非常感谢!我使用的是字符串生成器,是的,但是我回到了旧的+连接,因为我不知道还能做什么,然后我一直在尝试不同的方法来隔离这个问题。。。我琢磨着“引用”,但忘了我怎么会这么做,XD这么傻,太谢谢你了!我知道问题应该出在sql语句上:)当保存密码验证器时,仅仅使用散列函数(如MD5)是不够的,仅仅添加一个salt对提高安全性几乎没有作用。@zaph关于sql注入,这足够吗?密码,我应该怎么做,使用不同的散列?我担心的是,它必须适合数据库和它的varchar25help@zaph您的意思是验证用户提供的输入,如果它有大写字母,或者至少有6个长度?即使我做了6段测试,你能告诉我你的意思吗?:)正确处理密码有两个方面:开发人员易于实现或用户安全。在我看来,道德上正确的选择是用户的安全。1.这是您的选择:用户安全或varchar25。2.MD5提供的安全性不足,对于Java来说,最好的选择可能是NIST推荐的PNKFD2。3.WRT sql injection:。@zaph PBKDF2,你的意思是:)我看到了你的评论,谢谢!在上面
String sql = "SELECT * FROM javabase.user WHERE username = '"+ user +"' and password = '"+pw+"';";
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;
}