0

我正在尝试使用 select where 语句获取特定数据。我有一个运行良好的数据库。我到目前为止所做的是

while (rs.next()){

            String username2=rs.getString("username");
            if(puname.equals(username2)) {
                System.out.println(puname);
                String queryPass= "select password from userdata where username="+username2;
                rs2 = st.executeQuery(queryPass);
                String passdb=rs2.getString("password");
                System.out.println("pass"+passdb);

结束我得到的错误是'where子句'中的未知列'john'

4

3 回答 3

2

这是您生成的 SQL 字符串:

select password from userdata where username=John

它没有被引用,所以数据库认为它是一个列名。

您可以使用, 并在值应位于的PreparedStatement位置放置一个字符。?然后您可以setString在执行查询之前提供值。使用这种技术(绑定变量)可以防止 SQL 注入,而简单地将您的值直接引用到字符串中则不会。

于 2013-08-02T20:46:06.810 回答
1

我看到的一个问题是:

String queryPass= "select password from userdata where username="+username2;

应该是(当 String 参数时,把它放在单引号中):

String queryPass= "select password from userdata where username= '"+username2+"'";

注意:建议使用PreparedStatments而不是普通的 SQL 语句,以避免 SQL 注入。

于 2013-08-02T20:45:57.257 回答
1

正如其他 2 个答案中所指出的,您正在构建格式错误的 SQL 语句。这是您不应该以这种方式生成 SQL 的一个原因(但可能是最不重要的原因,因为它是快速失败的)。

通过使用准备好的语句:

//statement is a global\cached statement
if(statement == null) {
    String sql = "select password from userdata where username=?";
    statement = connection.prepareStatement(sql);
}
statement.setString(1, "John");
ResultSet rs = statement.executeQuery(selectSQL);

数据库只需为语句制定一次执行计划(这是一项代价高昂的工作),并且您可以免受 SQL 注入的影响。

在您的示例中,如果我传递了值:'stu' or 1=1我将能够执行该语句:

select password from userdata where username='Stu' or 1=1

返回数据库中的所有密码。

于 2013-08-02T20:59:11.063 回答