gpt4 book ai didi

sqlite - SELECT WHERE .. LIKE 使用 fmdb 的正确参数绑定(bind)?

转载 作者:行者123 更新时间:2023-12-03 15:56:13 29 4
gpt4 key购买 nike

这里是 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(. .),它也返回零,因此参数不会被放入 LIKE 中,因此查询的结果集是错误的。

我知道这绝对是错误的方法(SQL 注入(inject)),但这是我设法让我的 LIKE 兑现的唯一方法:

NSString *queryString = [NSString stringWithFormat:@"SELECT * FROM items WHERE track LIKE '%%%@%%' ORDER BY linkNum;", filter];
results = [db executeQuery:queryString];

(我也尝试了所有排列,但用转义双引号代替此处显示的单引号)

更新:

我也试过 fmdb 自己的 ...WithFormat 变体,它应该提供便利和防止注入(inject):

[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 文档)

最佳答案

错误是根本不包含任何引号:

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

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

关于sqlite - SELECT WHERE .. LIKE 使用 fmdb 的正确参数绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22541454/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com