Objective-C中在LIKE语句中添加查询参数的sqlite操作

5
我正在使用Objective-C通过C API使用sqlite。我的应用程序的一个预期功能是,用户可以搜索人名,并在输入每个新字符时执行使用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 注入),并实现我想要的结果?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接