首次使用fmdb的用户,试图正确地开始做事。我有一个简单的单表,我希望在尝试几种记录的方法时和之后执行SELECT WHERE .. LIKE查询,我无法得到任何结果。
e.g。
// '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(..)
,它也返回零,所以参数没有插入LIKE,然后查询中的resultSet是错误的。
我知道这绝对是错误的做法(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 docs)
答案 0 :(得分:3)
错误包括任何引号:
[db executeQuery:@"SELECT * FROM items WHERE track LIKE ? ORDER BY linkNum;", filter];
...而%
现在位于filter
变量中,而不是在查询中。