动态创建SQLite入侵参数

时间:2012-07-26 06:08:21

标签: javascript sql sqlite web-sql

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

我已经在正确的位置创建了正确数量的?s,但我无法弄清楚如何将值添加到[...]内的参数中。

当我使用一个包含[...]内所有参数值的变量时,我得到一个错误“语句字符串中的'of'数'与参数字符串不匹配”。我也尝试为每个占位符集使用一个变量。这也行不通。我想根据参数的数量检查占位符的数量,并在读取变量之前返回错误。

// 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 个答案:

答案 0 :(得分:0)

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

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