我正在尝试查询数据库以选择数据库中存在的用户(登录)。
Config.java class
public class config {
protected static String dbhost = "localhost";
protected static String dbport = "1433";
protected static String dbuser = "root";
protected static String dbpass = "";
protected static String dbname = "BenxHR";
}
my database handler classs:
public class DbHandlers extends config{
protected Connection dbconnection;
public Connection getConnection(){
final String ConnectionString = "jdbc:sqlserver://" + config.dbhost + ":" +
config.dbport + ";databaseName=" + config.dbname;
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
} catch (ClassNotFoundException e) {
System.err.println(e.getMessage());
}
try {
dbconnection = DriverManager.getConnection(ConnectionString, config.dbuser, config.dbpass);
} catch (SQLException e){
System.err.println(e.getMessage());
}
return dbconnection;
}
}
The query:
private void clickLogin(MouseEvent event) throws SQLException {
String query1 = "SELECT * FROM users WHERE username = ? OR email = ?
AND password = ?";
con = handler.getConnection();
pst = con.prepareStatement(query1);
pst.setString(1, usernameField.getText());
pst.setString(2, usernameField.getText());
pst.setString(3, passwordField.getText());
ResultSet rs = pst.executeQuery();
if(!rs.isBeforeFirst()){
System.out.println("Failed.");
} else {
System.out.println("Success");
}
}
所以我有一个包含数据库信息的类,如ip,port,user和password。我还有一个SELECT语句,它选择数据库项并返回一个行值,具体取决于它是否成功返回。
一切似乎都在起作用,并且不会抛出任何异常,但无论使用哪个用户名和密码,它都会打印出“成功”这一行。
有没有人有理由说明为什么会这样?
答案 0 :(得分:1)
适合使用参数。传递密码不好。您应该加密它们并仅以加密状态传递它们。
这不会解决您的问题,但您的查询不符合您的意图。它正在做:
OR
据推测,您是SQL新手。我建议您在条件中混合AND
和WHERE (username = ? OR email = ?) AND password = ?)
时使用括号。大概你打算:
double a = 1.1 * 3.1;
cout <<a; //gives 3.4100000000000006 instead of 3.41
正如我所说的那样,如果您的版本没有返回行,则不会返回行。