Ошибка подготовленного оператора - PullRequest
1 голос
/ 01 апреля 2012

Недавно только что изменил мои операторы в SQL на подготовленные операторы по соображениям безопасности, и вот что я придумала ..

К сожалению, в результате не может найти ошибку на

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

Вся ошибка:

Не удается найти символ: символ: метод prepareStatement (java.lang.String) расположение: переменная dbAccess типа HolidayExchange.DBAccess

Я понимаю, что он находит строку, когда она должна быть подготовлена, но так я всегда вижу в примерах и т. Д.

Возможно, я делаю что-то идиотское, но любая помощь в решении этой проблемы будет очень полезна!

Весь метод:

DBAccess dbAccess = new 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;
    }
}`

Ответы [ 5 ]

2 голосов
/ 01 апреля 2012

Отсутствует пробел

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

должно быть

     // space added before passsword:
     "SELECT * FROM owner WHERE username = ? AND" + " password = ?;"; 
0 голосов
/ 19 декабря 2015

если у вас есть импорт com.mysq.jdbc.*;, удалите его и измените на импорт java.sql.PreparedStatement;, следовательно, наоборот, потому что я думаю, что этот метод PreparedStatement, который вы используете, не подходит для базы данных, к которой вы подключаетесь.

0 голосов
/ 01 апреля 2012

Не удается найти символ: symbol: метод prepareStatement (java.lang.String) расположение: переменная dbAccess типа HolidayExchange.DBAccess

Это сообщение об ошибке не имеет ничего общего с плохо отформатированным SQL. Это ошибка времени компиляции. В классе HolidayExchange.DBAccess отсутствует метод с именем prepareStatement, который принимает java.lang.String в качестве аргумента.

Ваш SQL не проверен (или оценен) во время компиляции, поэтому он не может быть причиной ошибок во время компиляции. Получив его для компиляции, вы, вероятно, обнаружите, что после удаления одинарных кавычек вокруг вопросительных знаков ваш запрос будет работать нормально.

0 голосов
/ 01 апреля 2012

Всегда регистрируйте 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);

0 голосов
/ 01 апреля 2012

Для каждого знака вопроса попробуйте заключить их в одинарные кавычки.

 '?'
...