Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 严重:null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列';管理员';在';其中第'条;_Java_Mysql_Sql_Jdbc - Fatal编程技术网

Java 严重:null com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列';管理员';在';其中第'条;

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,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册

我仍然无法找到为什么我的SQL语句不能在我的JAVA程序上运行,但它们是在工作台上运行的

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

严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:字段列表中的未知列“Admin”

我在数据库中有一个用户名“Admin”,可以在workbench上看到

另外,如果我点击Clear按钮并键入OK,它不会给出注册错误,我可以看到我拥有的数据表,因为它跳过了尝试注册代码的部分,因为字符串是空的,并且运行else块

(MyUserApp类上的代码)

当我尝试登录时会发生这种情况

当我尝试注册时会发生这种情况:

让用户登录的代码基本上如下所示:

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;

     }