2011-06-03 40 views
1

我正在使用Ruby Sqlite3库将一些记录插入到数据库中。我有问题得到下面的声明工作(我已经尝试过所有发布的变体);我得到一个SQLite3::RangeException - bind or column index out of range:异常。插入多个参数给出SQLite3 :: RangeException

该查询的作品,如果我只是硬编码的价值......所以我做错了什么?

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'] 

回答

2

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

它看起来像你多余的语录以某种方式逃避参数指标,并且驱动程序没有看到它们。

使用此:

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

您们提出这个难度比它需要的是。别担心,这种参数绑定完全可以防止SQL注入,即使没有额外的引号。

+1

您也不应多次使用“准备”语句。如果你这样做,你完全无法使用它的目的。 prepare方法负责构建查询的开销,您只需要执行一次。之后,您可以根据需要随时多次执行该准备好的语句,从而获得仅执行一次开销的性能。 – 2012-04-17 16:27:43