使用fmdb更正SELECT WHERE .. LIKE的参数绑定?

时间:2014-03-20 18:01:34

标签: sqlite fmdb

首次使用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)

1 个答案:

答案 0 :(得分:3)

错误包括任何引号:

[db executeQuery:@"SELECT * FROM items WHERE track LIKE ? ORDER BY linkNum;", filter]; 

...而%现在位于filter变量中,而不是在查询中。