动态创建 SQLite 子句参数

Posted

技术标签:

【中文标题】动态创建 SQLite 子句参数【英文标题】:Dynamically Create SQLite In-Clause Parameters 【发布时间】:2012-07-26 06:08:21 【问题描述】:

我正在尝试为依赖 SQLite 进行持久存储的基于 Web 的应用程序创建过滤器功能。我正在尝试使用准备好的语句,但它必须根据用户选中的框数动态创建。我创建了一个动态添加的查询?占位符(使用来自IN clause and placeholders 的建议)。

我已经在正确的位置创建了正确数量的 ?,但我不知道如何将值添加到 [...] 内的参数中。

当我使用包含 [...] 内所有参数值的变量时,我收到错误消息“语句字符串中的 '? 数量与参数字符串不匹配”。我还尝试为每组占位符使用一个变量。那也没用。我想会根据参数的数量检查占位符的数量,并在读取变量之前返回错误。

// just spaced it with returns and removed the +'s and "'s to make it easier to read
var filterQuery =   SELECT t1.col1, t1.col2, t1.col3, t2.col2, t3.col2
                    FROM t1, t2, t3
                    WHERE t1.col2 = ? 
                    AND t1.col3 IN ( ?, ?, ?)
                    AND t2.col2 IN ( ?, ?, ?, ?)

代码:

db.transaction(function(tx) 
    tx.executeSql(
        filterQuery,
        [/* what do I put in here so that the number of ?s matches with the number of parameters? */],
        success,
        failure
    );
);

如何动态插入参数,使它们与占位符的数量相匹配并避免不匹配错误?

澄清:我已经成功运行了没有准备好的语句的查询。我希望有一个解决方案可以让我使用它们。

(额外的问题 - 这个查询会做我希望它做的事情,即只抓取与用户所做的所有选择匹配的行吗?)

提前致谢!

【问题讨论】:

【参考方案1】:

最快的方法是在动态 SQL 中使用实际参数值而不是问号 (?),例如

WHERE t1.col2 = 'searchstring' 
AND t1.col3 IN ( 12, 23, 24)
AND t2.col2 IN ( 'value', 'onemorevalue', 'x', 'y')

【讨论】:

但是这样你就不能使用prepared statement了(因为你的语句每次都会不同,每次执行都会强制SQL引擎解析语句),你要担心关于 SQL 注入。 正确,但似乎语句已经不是静态的(“取决于在正确的位置创建正确数量的 ?s”)。正如我所说,这是更快的方式,但不是最好的;) @KolA - 感谢您的建议。不过,弗兰克是对的。我应该在问题中明确表示我想坚持准备好的陈述。

以上是关于动态创建 SQLite 子句参数的主要内容,如果未能解决你的问题,请参考以下文章

这个动态创建的 sql 有多脆弱?

java中动态创建的order by子句在Veracode扫描中显示为sql注入问题

SQLite 动态 WHERE 子句不起作用

如何从 Android SQLite 查询的动态 ArrayList 编写 WHERE IN 子句

动态创建 JOOQ 查询

python在sqlite动态创建表源码