Цель-C: Вам нужно избегать одинарных кавычек в строках, предназначенных для SQL? - PullRequest
1 голос
/ 28 февраля 2010

Я разработчик для iPhone. Я пишу свои примеры модульных тестов, один из которых проверяет, принимает ли приложение строки UTF8 для записи в базу данных sqlite3. Я создал тестовый пример для генерации случайных строк UTF8, и я вижу, что неуспешные строки делают это, потому что они содержат апостроф ('), который мне нужно принять.

Я пишу в базу данных так:

NSString *query=@"INSERT INTO song (id,title, duration) VALUES (?,?,?);";
sqlite3_stmt *_statement;
insert=sqlite3_prepare_v2(_database, [query UTF8String], -1, &_statement, NULL);
sqlite3_bind_text(_statement, 1, [value1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(_statement, 2, [value2 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(_statement, 3, [value3 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_step(_statement);

Должен ли я вручную избегать апострофов в значении 1-3 с заменой или чем-то в этом роде? Если это так, то это отстойно ...

1 Ответ

1 голос
/ 28 февраля 2010

В данном контексте это не апостроф, а одиночная кавычка, которую компилятор увидит как разделитель строки. Поскольку вы строите строку для отправки в SQL, неэкранированная одинарная кавычка разрушит строку, в которой она возникает.

Вы всегда должны экранировать одинарные и двойные кавычки в любом строковом контексте. Это относится ко всем языкам, а не только к Си.

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

Edit:

Хорошо, я неправильно понял. В общем, для форматирования ввода из пользовательского интерфейса вы должны использовать подкласс NSFormatter . Это в основном позволяет вам превращать что-либо в строку и обратно. Он чаще всего используется для дат, чисел, форматированных строк, таких как phone # и т. Д., Но он может выполнять любые преобразования или манипуляции со строками. В этом случае вам понадобится средство форматирования для автоматического экранирования одинарных кавычек в вводимых пользователем строках. Кто-то, возможно, уже написал один.

Но я должен сказать, что не думаю, что это проблема, потому что:

  1. NSString очень хорош в обработке кавычек. Вы можете даже взять UTF8String с одиночными галочками и выбросить ее прямо через printf, которая, как известно, суетлива в таких вещах. Я не уверен, что проблема в Objective-C - это проблема.
  2. Я не нашел других упоминаний об этой проблеме. SQL широко используется на iPhone и на Mac, и если API Apple не справится с очень распространенным шаблоном ввода, я ожидаю увидеть сотни публикаций о работе с кавычками в запросах SQL.

Я давно не разбирался с SQL, поэтому не могу точно сказать, в чем проблема, но я бы не стал фокусироваться на аспектах Objective-C.

...