Цель-с помощью SQLite, добавив запрос с параметрами внутри как П.
Я использую sqlite
в Objective-C через C API. Одна из предполагаемых особенностей моего приложения заключается в том, что пользователь может искать имя человека, и с каждым новым символом, который он вводит, выполняется SQL-запрос с использованием LIKE
, чтобы найти всех людей, чьи имена соответствуют требованиям. Проблема, с которой я сталкиваюсь, заключается в параметризации соответствия внутри подобного, без того, чтобы знак вопроса интерпретировался буквально. То есть, я считаю, что приложение в настоящее время ищет имена людей, которые включают ?
в них (то есть никто).
Мой код выглядит так:
const char *sql = "SELECT rowid, name, email FROM person WHERE name LIKE '%?%'";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) {
NSLog(@"Problem preparing getFilteredPeopleStubs statement.");
}
if(sqlite3_bind_text(sqlStatement, 1, [searchText UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK){
NSLog(@"Problem binding search text param.");
}
В основном, searchText
- это то, откуда яхочу , но на данный момент я считаю, что это просто поиск людей, чье имя содержит ?
, из-за одиночных цитат в '%?%'
. Есть ли решение этой проблемы, которое все еще позволяет мне использовать параметризованный запрос (защита от SQL-инъекции) и достигает того, что я ищу?
1 ответ:
Поместите символы
%
вsearchText
, например (извините за каламбур):const char *sql = "SELECT rowid, name, email FROM person WHERE name LIKE ?"; sqlite3_stmt *sqlStatement; if(sqlite3_prepare_v2(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) { NSLog(@"Problem preparing getFilteredPeopleStubs statement."); } NSString *bindParam = [NSString stringWithFormat:@"%%%@%%", searchText]; if(sqlite3_bind_text(sqlStatement, 1, [bindParam UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK){ NSLog(@"Problem binding search text param."); }