1

出于安全原因,最近刚刚将我在 SQL 中的语句更改为准备好的语句,这就是我想出的..

不幸的是,它出现了一个找不到错误

"SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

整个错误:

找不到符号:符号:方法 prepareStatement(java.lang.String) 位置:HolidayExchange.DBAccess 类型的变量 dbAccess

我意识到当它应该是一个准备好的语句时它正在寻找一个字符串,但这就是我在示例等中总是看到它的方式。

我可能在做一些愚蠢的事情,但解决这个问题的任何帮助都会非常有帮助!

整个方法:

DBAccess dbAccess = 新的 DBAccess();

        String sql = "SELECT * FROM owner WHERE username = '?' AND"+
                " password = '?'";

        PreparedStatement ps = dbAccess.prepareStatement(sql);

        ps.setString(1,u);
        ps.setString(2,p);

        ResultSet rs = dbAccess.executeQuery2(ps);
        User user = new User();
        while (rs.next()){
            user.setFirstname(rs.getString("firstname"));
            user.setSurname(rs.getString("surname"));
            user.setUsername(rs.getString("username"));
            user.setPassword(rs.getString("password"));
        }

        rs.close();
        dbAccess.close();

        if(user.getUsername().length()==0){
            return null;
        }else{
            return user;
        }
    } catch (Exception e) {
        return null;
    }
}`
4

5 回答 5

2

缺少一个空格

      // becomes ANDpassword in the resulting string:
     "SELECT * FROM owner WHERE username = ? AND" + "password = ?;"; 

应该

     // space added before passsword:
     "SELECT * FROM owner WHERE username = ? AND" + " password = ?;"; 
于 2012-04-01T14:42:57.670 回答
0

找不到符号:符号:方法 prepareStatement(java.lang.String) 位置:HolidayExchange.DBAccess 类型的变量 dbAccess

此错误消息与格式错误的 SQL 无关。这是一个编译时错误。HolidayExchange.DBAccess 类没有名为 prepareStatement 的以 java.lang.String 作为参数的方法。

您的 SQL 在编译时未经过验证(或评估),因此它不能成为编译时错误的原因。一旦你编译它,你可能会发现在你删除了问号周围的单引号之后,你的查询就可以正常工作了。

于 2012-04-01T17:59:29.753 回答
0

在执行查询之前始终记录 ps.toString()。这将使程序员知道实际执行了什么查询。

此外, PreparedStatement 不是字符串

连接 con = null; Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection("jdbc:mysql:localhost:3306/jdbctutorial","root","root"); PrepareStatement ps = con.prepareStatement(sqlQuery);

于 2012-04-01T15:02:50.053 回答
0

如果您有导入com.mysq.jdbc.*;删除它并将其更改为导入java.sql.PreparedStatement;,反之亦然,因为我认为您使用的 PreparedStatement 方法不适合您正在连接的数据库。

于 2015-12-19T20:30:28.867 回答
-1

对于每个问号,尝试在它们周围加上单引号。

 '?'
于 2012-04-01T14:46:18.637 回答