【问题标题】:Correct parameter binding for SELECT WHERE .. LIKE using fmdb?正确的 SELECT WHERE 参数绑定 .. LIKE 使用 fmdb?
【发布时间】: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 文档)

【问题讨论】:

    标签: sqlite fmdb


    【解决方案1】:

    错误是完全包含任何引号:

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

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

    【讨论】:

    • 为此,我假设您将% 合并到您的filter 值中。
    猜你喜欢
    • 2013-05-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2019-06-02
    • 2014-12-20
    • 2011-11-28
    相关资源
    最近更新 更多