Цель-с помощью 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 4

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.");
}