2012-11-13 38 views
4

我在Objective-C中通过C API使用sqlite。我的应用程序的一个预期功能是用户可以搜索人名和他们输入的每个新字符,执行一个使用LIKE的SQL查询来查找名称符合匹配条件的所有人。我遇到的问题是参数化LIKE内部的匹配,而不用字面解释问号。也就是说,我相信目前该应用正在寻找包含?(其中没有人)的人名。Objective-C sqlite在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

%字符转换为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."); 
}