【发布时间】:2019-08-26 19:02:16
【问题描述】:
我有用户尝试注册到网站。在他们可以注册之前,在 SQL 数据库中搜索他们选择的用户名,以确保它不存在。 问题是永远不会搜索名称,因为 ResultSet 总是返回空。我认为这是准备好的声明。
我认为我准备好的语句没有执行。我正在使用executeQuery() 执行我的语句,因为这就是我插入用户名的方式,没有任何问题。我从插入用户名的方法中得到了搜索结果集部分if (rs.next())...。与String SQL 和准备好的语句相同。
String SQL = "SELECT * FROM users WHERE username='" + getUsername() + "'";
System.out.println(SQL);
// prints out SELECT * FROM users WHERE username='whatever I searched'
// so this String is valid
if (db.getConn() != null){
System.out.println("connected to database");
// always prints
}
PreparedStatement preparedStatement = db.getConn().prepareStatement(SQL);
// preparedStatement.setString(1, getUsername());
ResultSet rs = preparedStatement.executeQuery();
// userNameCounter = rs.getString("username");
// putting this here returns an sqlexception. empty set
if (preparedStatement != null){
System.out.println("ps != null");
// prints this
}
if (rs != null){
System.out.println("rs != null");
// prints this
}
if (!rs.next()){
System.out.println("!rs.next");
// prints this
}
if (rs.next()) {
userNameCounter = rs.getString("username");
System.out.println("rs.next()");
// doesn't print
// so the resultset is empty
if (!userNameCounter.equals(getUsername())) {
System.out.println("that username is unique");
return true;
}
}
preparedStatement.close();
incorrectLabels.setText("That username is already taken");
incorrectLabels.setVisible(true);
System.out.println("that username is already there");
// this always prints. it shouldn't
return false;
所以executeUpdate() 需要int 但我不确定我会放在那里。只做execute() 会引发错误Requires ResultSet found boolean。我认为没有任何语法错误,因为该表称为users。我尝试的一切只会让我回到由空集导致的错误。如果您需要更多代码,请告诉我,但这是发生错误的地方。
谢谢!
【问题讨论】:
-
您应该准备您的声明使用占位符值。这里面有一个SQL injection bug。
-
为什么不打印
getUserName()? -
@AndrewLazarus
getUserName()打印出正确的用户名。 -
@tadman 问题不是注入错误,当我更改为占位符然后打印
String SQL它会打印 SELECT * FROM users WHERE username=?不确定“?”是否应打印为搜索的用户名。也不能修复空结果集 -
如果结果集为空,仅表示没有给定用户名的用户。
标签: java mysql prepared-statement resultset