fmdb - запросу Select с нравится избегать внедрения SQL

Привет парни и с Рождеством Христовым всех вас!

Я строю приложение для iOS, используя sqlite и fmdb как обертка. Я пытаюсь выполнить следующее sql заявление:

SELECT * FROM TABLE WHERE FIELD LIKE '%text%'

с текстом, прибывающим из UISearchBar.

До сих пор единственный способ, которым я получил его работа, был со следующим кодом:

NSString *query = [NSString stringWithFormat:@"SELECT * FROM TABLE WHERE FIELD LIKE '%%%@%%'", text];
FMResultSet *results = [db executeQuery:query];

Пожалуйста, обратите внимание, что я публикую только код вопроса. Это работает хорошо.

Что я хочу, хотя, должен избежать внедрения SQL, таким образом, я пробую что-то как:

NSString *query = @"SELECT * FROM TABLE WHERE FIELD LIKE %%?%%";
FMResultSet *results = [db executeQuery:query, text];

или что-то как:

NSString *query = @"SELECT * FROM TABLE WHERE FIELD LIKE ?";
FMResultSet *results = [db executeQuery:query, [NSString stringWithFormat:@"%%%@%%", text]];

это не работает. То же самое происходит с одинарными кавычками вокруг подобного пункта (' %%? %% ') или единственный % вместо дважды.

Можно ли идти меня через эту проблему? Любая помощь очень ценилась бы!

С Новым годом!

2
nl ja de
+1 я люблю факт это you' ре, обращающееся с этим правильно. Слишком много людей беспечно строят свой SQL, использующий stringWithFormat использование снабженных пользователями областей, без соображения для случайного или преднамеренного использования символов кавычки в пользовательской области. Использование ? заполнитель должен использоваться, используя обеспеченный пользователями данные. В слишком многих приложениях, ища Joe' s "Дом Рыбы" проблематично.
добавлено автор Rob, источник

1 ответы

Вы последняя попытка (без любых кавычек) являетесь правильным синтаксисом. Вы проверяете, чтобы видеть, заканчивается ли не - ноль ? Если ноль , необходимо проверить на строку ошибки. Например, это работает:

NSString *searchString = @"larry";
NSString *likeParameter = [NSString stringWithFormat:@"%%%@%%", searchString];
NSString *sql = @"SELECT text_column FROM test WHERE text_column LIKE ?";

FMResultSet *results = [db executeQuery:sql, likeParameter];

if (!results)
{
    NSLog(@"error: %@", [db lastErrorMessage]);
    [db close];
    return;
}

while ([results next])
{
    NSLog(@"%s: %@", __FUNCTION__, results[0]);
}

[results close];
[db close];

Между прочим, если вы конкретны, и вы не хотите конечного пользователя, управляющего параметрами или получающего неинтуитивные ответы (и вы не хотите конечного пользователя, применяющего их собственные подстановочные символы), вы могли бы хотеть избежать случаев подстановочных символов, таких как % или _ , используя СПАСЕНИЕ синтаксис SQL. Таким образом вы могли бы хотеть определить константу для символа ESC:

NSString * const kEscapeCharacter = @"\\";

И затем, постройте свой SQL как:

NSString *likeParameter = [NSString stringWithFormat:@"%%%@%%", [self escapedLikeParameter:searchString]];
NSString *sql = [NSString stringWithFormat:@"SELECT text_column FROM test WHERE text_column LIKE ? ESCAPE '%@'", kEscapeCharacter];

Где escapedLikeParameter спасение % , _ , и сам подстановочный символ. Таким образом:

- (NSString *)escapedLikeParameter:(NSString *)string
{
    NSString *escapedString;
    escapedString = [string stringByReplacingOccurrencesOfString:kEscapeCharacter
                                                                withString:[NSString stringWithFormat:@"%@%@", kEscapeCharacter, kEscapeCharacter]];
    escapedString = [escapedString stringByReplacingOccurrencesOfString:@"_"
                                                             withString:[NSString stringWithFormat:@"%@_", kEscapeCharacter]];
    return [escapedString stringByReplacingOccurrencesOfString:@"%"
                                                    withString:[NSString stringWithFormat:@"%@%%", kEscapeCharacter]];
}

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

3
добавлено
Большое спасибо Грабит! Оба предложения (убежал или не) добиваются цели для меня! Спасибо за полный ответ также
добавлено автор ozzotto, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)