Objective-C sqlite 在 LIKE 子句中添加查询参数

标签 objective-c c sqlite sql-like

我通过 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/

相关文章:

Python SQLite 返回值

ios - 无法在 iOS 上的 AFNETWORKING 中使用多部分 POST 上传视频

ios - 单击相应的 UIButton 后如何转到 UITabBarController

c - Sqlite C接口(interface)获取单值结果

c - 为什么我的程序给我一个中止陷阱 : 6 error?

C语言从2个标准中选择一个排序函数

python - 从 Python 将 null 插入 Sqlite

ios - iOS 8分享扩展。如何使图像成为必需但文本可选

ios - 为什么在我的 xcode 项目中创建线程而无需我显式创建它们?

C argv[] 进行加倍并用它进行操作