我通过 C API 在 Objective-C 中使用 sqlite
。我的应用程序的预期功能之一是用户可以搜索一个人名,并且他们输入每个新字符时,都会执行一个使用 LIKE
的 SQL 查询来查找所有名字符合匹配条件的人.我遇到的问题是在 LIKE 中参数化匹配项,而没有按字面解释问号。也就是说,我认为该应用目前正在寻找其中包含 ?
的人名(即 nobody)。
我的代码是这样的:
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 注入(inject))并实现我所追求的目标?
最佳答案
将 %
字符放入 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.");
}
关于Objective-C sqlite 在 LIKE 子句中添加查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13357689/