2011-06-03 66 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