SQL ошибка Количество столбцов не соответствует значению в строке 1 - PullRequest
0 голосов
/ 16 февраля 2020

Я пропускаю ошибку со следующим для вставки в таблицу с четырьмя столбцами, message_id (автоинкрементный) message_sender, message_reciever, message_body. Я проверил похожие вопросы и не нашел решения. '' '

        <% String sender_id = request.getParameter("message_sender");
        String reciever_id = request.getParameter("message_reciever");
        String message = request.getParameter("message_body");

        try{
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/fyp", "root", "Kmd116352323!");
        Statement st = con.createStatement();

        st.executeUpdate("INSERT INTO messages(message_sender,message_reciever,message_body) VALUES('"+sender_id+", "+reciever_id+" , "+message+" ')");

        out.println("Your request has been noted."
                + " Please return to your user profile or log out");

        } catch(Exception e){
        out.println(e);
                }
        %>

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

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

Однако вместо исправления Непосредственная проблема, добавив эти пропущенные кавычки, вы должны перейти к использованию подготовленного выражения:

try (PreparedStatement pstmt = connection.prepareStatement(
        "INSERT INTO messages(message_sender,message_reciever,message_body) VALUES(?, ?, ?)") {
    pstmt.setString(1, sender_id);
    pstmt.setString(2, reciever_id);
    pstmt.setString(3, message);

    pstmt.executeUpdate();
}

Кроме того, вы действительно не должны помещать доступ к данным в JSP. Он принадлежит к DAO или классу обслуживания.

0 голосов
/ 17 февраля 2020

Это неверно:

VALUES('"+sender_id+", "+reciever_id+" , "+message+" ')

У вас есть ', охватывающий все значения ... Это означает, что sql будет думать, что вы отправляете только 1 значение. Если все они являются текстовыми значениями, это должно выглядеть следующим образом:

VALUES('"+sender_id+"', '"+reciever_id+"' , '"+message+"')

Если вы знаете, что некоторые значения относятся к типу INT, вам не нужно ' для этого значения:

VALUES("+sender_id+", "+reciever_id+" , '"+message+"')

Текстовые значения должны быть заключены в '

...