5

sqliteC APIを介してObjective-Cで使用しています。私のアプリの目的の機能の 1 つは、ユーザーが人の名前を検索し、新しい文字を入力するたびに SQL クエリをLIKE実行して、名前が一致するすべての人を検索できるようにすることです。私が直面している問題は、疑問符が文字通り解釈されることなく、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 インジェクションに対する保護) を使用して、目的を達成できるこの問題の解決策はありますか?

4

1 に答える 1

5

Put the % characters into searchText, like (excuse the pun) this:

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.");
}
于 2012-11-13T09:00:20.137 に答える