使用多个参数插入会产生SQLite3 :: RangeException

时间:2011-06-03 19:28:59

标签: ruby sqlite

我正在使用Ruby Sqlite3库将一些记录插入数据库。我在让下面的陈述发挥作用时遇到了问题(我已经尝试了所有发布的变体);我得到SQLite3::RangeException - bind or column index out of range:例外。

如果我只是将值硬编码到其中,则查询有效...所以我做错了什么?

  statement = db.prepare("insert into IntegrationLogin (Username, Password, ProjectID) values (\"?1\", \"?2\", 1)")
  statement.execute [params['username'], params['password']]

  statement = db.prepare("insert into IntegrationLogin (Username, Password, ProjectID) values (\"?1\", \"?2\", 1)")
  statement.execute params['username'], params['password']

  statement = db.prepare("insert into IntegrationLogin (Username, Password, ProjectID) values (\"?\", \"?\", 1)")
  statement.execute params['username'], params['password']

1 个答案:

答案 0 :(得分:2)

我认为您的问题在于尝试将参数指示符(?)封装在引号中。这是不必要的,因为驱动程序将字符串参数包装在引号中,并在执行查询之前执行任何其他转义。当我删除引号时,您的示例查询执行得很好。

看起来你的多余报价以某种方式逃离参数指标而且司机没有看到它们。

使用此:

statement = db.prepare("insert into IntegrationLogin (Username, Password, ProjectID) values (?, ?, 1)")

你做得比你需要的更难。不用担心,即使没有额外的引号,这种参数绑定也完全阻止了SQL注入。