5

sqlite通过 C API 在 Objective-C 中使用。我的应用程序的预期功能之一是用户可以搜索一个人名,并且对于他们输入的每个新字符,LIKE执行一个 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 注入)并实现我所追求的?

4

1 回答 1

5

%字符放入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.");
}
于 2012-11-13T09:00:20.137 回答