как бороться с запятыми и апострофами при вставке в SQLite - PullRequest
0 голосов
/ 31 января 2012

У меня есть строка, которая содержит апостроф и запятую, и когда я выполняю вставку в SQLite, это выдает мне ошибку, например, с такой строкой:

...., 'The Smiths - I Know It's Over', .....
"Over": syntax error Unable to execute statement

как я могу или что я могу сделать, чтобы сохранить апострофв строке, но преформа правильная вставка?я использую Qt c ++.

Ответы [ 3 ]

7 голосов
/ 31 января 2012

Вы не должны помещать произвольные строки непосредственно в SQL - это требует атаки с использованием инъекций . Вместо этого используйте связанные параметры ; что-то вроде:

sqlite3_stmt * statement;
sqlite3_prepare(db, "select * from students where name=?", -1, &statement, NULL);
sqlite3_bind_text(statement, 1, "'; drop table students --", -1, SQLITE_STATIC);
sqlite3_step(statement);
sqlite3_finalize(statement);

Это заменит первый параметр (?) в запросе указанной строкой, без опасности того, что какой-либо символ ' будет интерпретирован как конец строки или любая часть строки будет выполнена как SQL.

3 голосов
/ 31 января 2012

Из FAQ :

(14) Как использовать строковый литерал, содержащий встроенный символ одинарных кавычек (')?

Стандарт SQL указывает, что одиночные кавычки в строках экранируются путем помещения двух одинарных кавычек в строку.В этом отношении SQL работает как язык программирования Pascal.SQLite следует этому стандарту.Пример:

INSERT INTO xYz VALUES ('5 часов');

0 голосов
/ 31 января 2012

Я считаю, что в библиотеке mysql есть функция с именем mysql_real_escape_string для экранирования строки. Кроме того, вы можете использовать двойные кавычки для окружения строки или экранировать апостроф вашей входной строки, например 'The Smiths - I Know It\'s Over',

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...