【发布时间】:2014-04-27 19:10:23
【问题描述】:
第一次在这里使用 fmdb,试图开始正确地做事。我有一个简单的单表,我希望在尝试了几种记录的方法之后执行 SELECT WHERE .. LIKE 查询,但我无法得到正确的结果。
例如
// 'filter' is an NSString * containing a fragment of
// text that we want in the 'track' column
NSDictionary *params =
[NSDictionary dictionaryWithObjectsAndKeys:filter, @"filter", nil];
FMResultSet *results =
[db executeQuery:@"SELECT * FROM items WHERE track LIKE '%:filter%' ORDER BY linkNum;"
withParameterDictionary:params];
或者
results = [db executeQuery:@"SELECT * FROM items WHERE track LIKE '%?%' ORDER BY linkNum;", filter];
或者
results = [db executeQuery:@"SELECT * FROM items WHERE track LIKE '%?%' ORDER BY linkNum;" withArgumentsInArray:@[filter]];
我已经逐步完成,所有方法都集中在 fmdb 方法中:
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray*)arrayArgs orDictionary:(NSDictionary *)dictionaryArgs orVAList:(va_list)args
根据方法,因此哪些参数为零,然后它要么调用sqlite3_bind_parameter_count(pStmt),它总是返回零,或者,对于字典的情况,调用sqlite3_bind_parameter_index(..),它也返回零,所以参数不' t 被插入 LIKE,然后查询的结果集是错误的。
我知道这绝对是错误的方法(SQL 注入),但这是我设法让我的 LIKE 得到尊重的唯一方法:
NSString *queryString = [NSString stringWithFormat:@"SELECT * FROM items WHERE track LIKE '%%%@%%' ORDER BY linkNum;", filter];
results = [db executeQuery:queryString];
(我也尝试了所有排列,但使用转义的双引号代替此处显示的单引号)
更新:
我也尝试过 fmdb 自己的 ...WithFormat 变体,它应该提供方便和防止注入:
[db executeQueryWithFormat:@"SELECT * FROM items WHERE track LIKE '%%%@%%' ORDER BY linkNum;", filter];
再次,进入调试器,我可以看到 LIKE 是从这个转换而来的:
… LIKE '%%%@%%' ORDER BY linkNum;
到这里:
… LIKE '%%?%' ORDER BY linkNum;
… 这也继续从sqlite3_bind_parameter_count() 返回零,我希望正值等于“最大(最右边)参数的索引”。 (来自 sqlite 文档)
【问题讨论】: