4

我非常确信这是不可能的,但以防万一:

如何为IN运算符绑定正确的(列表)参数?

SELECT foo FROM bar WHERE baz IN ('cow', 'chicken');

不幸的是,这不起作用:

list = ['cow', 'chicken']
db.execute('SELECT foo FROM bar WHERE baz IN ?', list) 

参数绑定不仅比直接插值更漂亮,而且更安全:使用它的主要原因之一是阻止臭名昭著的Bobby Tables。但是,您是否坚持手动转义 IN 参数?

list = ['cow', 'chicken']
sqllist = list.map { |el| "'#{SQLite3::Database.quote(el)}'" }.join(',')
db.execute('SELECT foo FROM bar WHERE baz IN (#{sqllist})')

(示例是带有 sqlite3 gem 的 Ruby,但该问题实际上适用于为您进行参数绑定的所有语言/库。)

4

1 回答 1

3

您传递给的 SQLdb.execute只是一个字符串,占位符的数量只需要与您传递给它的值的数量相匹配。因此,您可以基于以下内容构建占位符list.length并使用字符串插值将它们放入:

placeholders = Array.new(list.length, '?').join(',')
db.execute("SELECT foo FROM bar WHERE baz IN (#{placeholders})", list)

这是非常安全的,因为您确切地知道会发生什么placeholders

于 2014-12-02T08:15:44.223 回答