Форум программистов, компьютерный форум CyberForum.ru

Java и базы данных

Войти
Регистрация
Восстановить пароль
 
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
#1

Как правильно экранировать одиночную кавычку для MySQL на Java? - Java БД

24.11.2016, 12:09. Просмотров 509. Ответов 10
Метки нет (Все метки)

Добрый день, уважаемые коллеги

Подскажите, пожалуйста, как быть? Сегодня утром обнаружил пренеприятнейший баг в моем проекте.
При вводе пользователем одиночной кавычки '
в любое текстовое поле формы и последующей попытки записать через JDBC sql-запрос в MySQL базу вылетает "SQL syntax exception". Необходимо экранировать одиночную кавычку, что бы исправить это дело.
Явно подобная проблема уже решалась неоднократно ранее? Есть ли в Java какой то метод экранирования для MySQL?

Или создать в ручную класс, а в нем метод:
Java
1
2
3
4
5
6
7
8
9
10
11
12
 // Замена символов ' и ' на соответственно  ' и  '
    private String replaceEscChars (String source) {
        StringBuffer sb = new StringBuffer ();
        for (int i = 0; i < source.length (); i++) {
            switch (source.charAt (i)) {
                case ' '': sb.append ('\ ''); break;
                case ' '': sb.append ('\ ''); break;
                default  : sb.append (source.charAt (i));
            }
        }
        return sb.toString ();
    }
И по каждому полю проводить проверку? Или наверное уже в контроллере проводить проверку...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2016, 12:09     Как правильно экранировать одиночную кавычку для MySQL на Java?
Посмотрите здесь:

Как правильно соединить Java и MySQL? - Java БД
Помогите ПЛИЗ. Надо соединится с базой MySQL. Как это сделать? Сначала слышал надо зарегистрировать драйвер. Я его скачал. Потом прописал...

Как правильно записывать данные в MySQL? - Java БД
подскажите, как быть!! осталось немножко, но никак не могу разобраться с тем, как информацию в БД вносить. вводим н/н номер, высвечивается...

Java и MySQL. Как сформировать запрос к БД - Java БД
Здравствуйте! В наличие имеется примитивная таблица DOCTORS состоящая из полей NAME, SPECIALITY, CABINET. Соответственно что бы...

Как программно подключиться к MySQL из Java? - Java БД
Как програмно подключиться к MySQL из Java? Кто-нибудь поможет с реальным примером JAVA для доступа к MySQL? Можно пример для...

Выборка mysql, как правильно сделать json? - Java БД
делаю выборку из базы через ajax. как правильно сформировать ответ json делаю так но получаю $rows=array(); ...

Нужно сделать серверную (Но не удалённую) БД в MySql и программку на Java для взаимодействия с ней - Java БД
Проблема в следующем. Нужно сделать серверную (Но не удалённую) БД в MySql и программку на Java для взаимодействия с ней. Тобишь связка...

Как правильно применять Java Servlets и JDBC? - Java БД
У меня есть программа которая терзает базу данных берёт оттуда данные и помещает их в html отчёт (моя программа т.е можно всё там менять) и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LeX
230 / 230 / 59
Регистрация: 30.06.2010
Сообщений: 856
24.11.2016, 13:39     Как правильно экранировать одиночную кавычку для MySQL на Java? #2
как ты запрос формируешь?
turbanoff
Модератор
Эксперт Java
3909 / 3644 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 11
Завершенные тесты: 1
27.11.2016, 17:06     Как правильно экранировать одиночную кавычку для MySQL на Java? #3
Для вставки данных пользователя в базу нужно использовать PreparedStatement. Это позволит отделить текст SQL от данных - и тогда не нужно будет ничего экранировать.
https://docs.oracle.com/javase/tutor.../prepared.html

Добавлено через 27 секунд
Примеры есть вот тут - JDBC FAQ для начинающих
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
28.11.2016, 14:19  [ТС]     Как правильно экранировать одиночную кавычку для MySQL на Java? #4
turbanoff, дак так и делаю, через PreparedStatement. Там Swing форма, JTextFeild и JTextArea, после заполнения пользователем, стандартно
MySQL
1
INSERT INTO table_name ... WHERE id = ' '
На работе буду в конце недели, перепроверю. Точно не помню, как там сделано. Но все работает идеально. Возникает проблема если в JTextArea вставить ', потому как данные собираются из нескольких полей формы и выполняется конкатенация, а когда доходит до символа ', statement думает что это конец вставляемой строки...
Спасибо всем. Я все же перепроверю, как на работе буду...
turbanoff
Модератор
Эксперт Java
3909 / 3644 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 11
Завершенные тесты: 1
28.11.2016, 17:30     Как правильно экранировать одиночную кавычку для MySQL на Java? #5
TurboDuck, конкатенации быть не должно.
Текст запроса должен выглядеть как-то так:
SQL
1
INSERT INTO TABLE_NAME ... WHERE id = ?
А значение для ? уже должно задаваться с помощью методов set* у PreparedStatement
Например с помощью setInt
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
28.11.2016, 18:08  [ТС]     Как правильно экранировать одиночную кавычку для MySQL на Java? #6
turbanoff, а вот это я как раз упустил! Спасибо!!
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
06.12.2016, 08:55  [ТС]     Как правильно экранировать одиночную кавычку для MySQL на Java? #7
turbanoff, а все равно не получится так. При апдейте критует, как записать строку "it's" в MySQL?

Java
1
2
3
4
5
6
7
8
String javaString = "It's a beautiful day";
String sql = "UPDATE table_name SET Column_Name = '"+javaString+"'";
 
try {
con = DriverManager.getConnection(conString, username, password);
s = con.prepareStatement(sql);
s.execute(sql);
{ catch .... и т.д.
И получаем:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax

javaString название переменной и ее содержимое просто для примера, строку получаем методом getText() из JTextField, может там как то парсить? Проверить текст и заменить символ на /' или так в Java не работает?

Добавлено через 7 минут
Не могли бы Вы поподробнее объяснить, как при помощи PreparedStatement обработать строку полученную методов getText() из поля JTextField?

Добавлено через 10 минут
Вариант такой нашел.. в принципе велосипед и наверное даже поедет.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    public static String forJSON(String input) {
        if (input == null || input.isEmpty()) {
            return "";
        }
        int len = input.length();
        // сделаем небольшой запас, чтобы не выделять память потом
        final StringBuilder result = new StringBuilder(len + len / 4);
        final StringCharacterIterator iterator = new StringCharacterIterator(input);
        char ch = iterator.current();
        while (ch != CharacterIterator.DONE) {
            if (ch == '\n') {
                result.append("\\n");
            } else if (ch == '\r') {
                result.append("\\r");
            } else if (ch == '\'') {
                result.append("\\\'");
            } else if (ch == '"') {
                result.append("\"");
            } else {
                result.append(ch);
            }
            ch = iterator.next();
        }
        return result.toString();
    }
Все таки интересно, как через PreparedStatement реализуется?
turbanoff
Модератор
Эксперт Java
3909 / 3644 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 11
Завершенные тесты: 1
06.12.2016, 13:51     Как правильно экранировать одиночную кавычку для MySQL на Java? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Надо так:
Java
1
2
3
4
5
String sql = "UPDATE table_name SET Column_Name = ?";
//...
PreparedStatement s = con.prepareStatement(sql);
s.setString(1, javaString);
s.execute();
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
06.12.2016, 16:13  [ТС]     Как правильно экранировать одиночную кавычку для MySQL на Java? #9
turbanoff, спасибо! А то не меня ни как не покидало чувство, что я изобретаю велосипед.

Добавлено через 1 час 39 минут
turbanoff, не могу понять где ошибка, сделал все как у Вас. Вылетает с исключением:
java.sql.SQLException: Parameter index out of range (1 > number of parametres, which is 0).

В импорте:
import java.sql.PreparedStatement;

Ниже по исключению:
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3321)

первая ссылка на код программы имено на строку:
Java
1
s.setString(1, javaString);
Похоже компилируется с методом PreparedStatement из другого пакета что ли?

Добавлено через 28 минут
Все разобрался! Мой косяк =)

Оставаясь подклассом класса Statement, класс PreparedStatement наследует все функции от Statement. Методы - execute, executeQuery и executeUpdate - модифицированы таким образом, что не имеют аргументов. Старые методы класса Statement (которые принимают SQL-выражения в качестве едиственного аргумента) не должны использоваться в объекте PreparedStatement.
turbanoff
Модератор
Эксперт Java
3909 / 3644 / 437
Регистрация: 18.05.2010
Сообщений: 9,174
Записей в блоге: 11
Завершенные тесты: 1
06.12.2016, 16:13     Как правильно экранировать одиночную кавычку для MySQL на Java? #10
TurboDuck, если так ругается, значит не хватает вопросиков в вашем тексте запроса.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2016, 07:02     Как правильно экранировать одиночную кавычку для MySQL на Java?
Еще ссылки по теме:

Как сделать связь между таблицами в базе данных MySQL Java - Java БД
Недавно начал изучать базы данных в джаве. Изучаю MySql Все первоначальные установки и загрузки делал вот по этим ссылкам: ...

Java и MySQL - Java БД
Здравствуйте! подскажите пожалуйста, почему не удается выбрать БД строчкой use one. в 30 строчке Выдает: java.sql.SQLException: No...

JAVA+Glasfish+MySQL - Java БД
Вот код : package testjdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.logging.Level; ...

Java+mySQL+russian - Java БД
традиционная тема. пересмотрел кучу постов на форумах. решение с set names ни при каких вариантах на проходят. Scanner sc= new...

Java-интерфейс к БД MySQL - Java БД
нужно написать интерфейс на java к бд(mysql) с чего мне начать? какие программыбиблиотеки нужны? что почитать по этому поводу? у...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 340
07.12.2016, 07:02  [ТС]     Как правильно экранировать одиночную кавычку для MySQL на Java? #11
turbanoff, проблема была в том, что я передавал параметр (sql запрос) в метод execute(), а в PreparedStatement, в отличие от Statement этот метод переопределен и не принимает параметры. Без параметров, все заработало.
Yandex
Объявления
07.12.2016, 07:02     Как правильно экранировать одиночную кавычку для MySQL на Java?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru