2015-04-15 32 views
1
if count == 1: 
     cursor.execute("SELECT * FROM PacketManager WHERE ? = ?", filters[0], parameters[0]) 
     all_rows = cursor.fetchall() 

    elif count == 2: 
     cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1]) 
     all_rows = cursor.fetchall() 

    elif count == 3 : 
     cursor.execute("SELECT * FROM PacketManager WHERE ? = ? AND ? = ? AND ? = ?", filters[0], parameters[0], filters[1], parameters[1], filters[2], parameters[2]) 
     all_rows = cursor.fetchall() 

這是我的程序中的代碼片段。我打算做的是傳遞查詢中的列名和參數。在Python中的SELECT語句中傳遞列名稱

filters數組包含列名,參數數組包含參數。計數是用戶設置的過濾器數量。過濾器和參數數組已經準備就緒,沒有問題。我只需要將它傳遞給查詢來執行。這給我的錯誤「類型錯誤:函數需要最多2個參數」

回答

3

您可以使用?,而不是表或列名僅設定參數。

你可以用預定義的查詢構建一個字典。

queries = { 
    "foo": "SELECT * FROM PacketManager WHERE foo = ?", 
    "bar": "SELECT * FROM PacketManager WHERE bar = ?", 
    "foo_bar": "SELECT * FROM PacketManager WHERE foo = ? AND bar = ?", 
} 

# count == 1 
cursor.execute(queries[filters[0], parameters[0]) 

# count == 2 
cursor.execute(queries[filters[0] + "_" + queries[filters[1], parameters[0]) 

這種方法將使您從SQL注入中節省filters[0]

+0

非常感謝!我已經閱讀了這個字典功能,我不知道如何把它放在我的代碼中。非常感謝! :D – OrdinaryProgrammer

+0

你好,我一直有這個錯誤,我不知道是什麼原因造成的。每當它運行雙過濾我繼續收到這個錯誤 類型錯誤:函數採用在(給定的3)最2個參數 的cpode低於顯示: cursor.execute(查詢[過濾器[0] +「_」 + filters [1]],(參數[0],),(參數[1],)) – OrdinaryProgrammer

+0

好吧,我剛剛發現我的愚蠢錯誤.lol 參數應該是: ,(parameters [0],參數[1],) – OrdinaryProgrammer

8

您不能使用SQL參數來插入列名稱。您必須爲這些部分使用經典字符串格式。這是SQL參數的;它們會引用值,因此它們不可能被解釋爲SQL語句或對象名稱。

下,使用字符串格式化爲列名的作品,但是要100%肯定filters[0]價值並非來自用戶的輸入:

cursor.execute("SELECT * FROM PacketManager WHERE {} = ?".format(filters[0]), (parameters[0],)) 

你可能想驗證列名反對一組允許的列名,以確保不會發生注射。

+1

感謝您的解釋,現在我明白了爲什麼它不允許它:) – OrdinaryProgrammer