2011-01-25 38 views
1

我想根據隨機變量從行中獲取特定值。下面是一個例子表PID列是一個「自動增量的主鍵整數」和其他2列TEXTPython SQL從特定變量字段中選擇行

例如表

PID NAME PHONE 
--- ---- ----- 
1  bill 999-9999 
2  joe  888-8888 

我想在表拋出的隨機變量

randomVariable = raw_input('Enter something: ')

> 1

,並讓代碼返回名稱

>議案

我知道我可以使用類似...

randomVariable = raw_input('Enter something: ') 
sql = ("SELECT name FROM example_table WHERE pid='%s'" % randomVariable) 
result = cursor.execute(sql) 
print result 

>議案

顯然使用 '%s' 沒有安全,但我們建議使用「? 「在它的地方。

randomVariable = raw_input('Enter something: ') 
sql = ("SELECT name FROM example_table WHERE pid=?", randomVariable) 
result = cursor.execute(sql) 
print result 

但這似乎不適用於我。我結束了......

"ValueError: operation parameter must be str or unicode"

我意識到我可能只是抓住所有的行,並把它們放在一個變量,然後我可以遍歷,直到我找到我尋找,但我在想,對於大型數據庫來說效率不高。任何人都可以幫助我指出正確的方向嗎?

回答

3

我相信你打算使用它像這樣

randomVariable = raw_input('Enter something: ') 
sql = "SELECT name FROM example_table WHERE pid=?" 
result = cursor.execute(sql, randomVariable) 
print result 
+0

男人終於!我得到了我一直在尋找的結果。這是我很少遇到的那些編程經驗之一......我只知道解決方案將會很簡單。感謝cyberkiwi – shload

1

驗證用戶的輸入,並%s是罰款。存儲你的行並把它們放到列表中並不是一個好主意,在全部,因爲行數量會隨着時間增長,甚至在不使用時佔用大量的內存。爲了防範SQL注入,您可以使用類似於類型轉換的東西來驗證輸入到int,然後將其放入try/except塊中,這樣可以停止所有惡意輸入,如'OR 1 = 1--

+0

感謝您輸入故障。儘管你失去了我,「你可以使用類似int類型的類型來驗證輸入,」。我用cyberkiwis發佈了我正在尋找的東西,但我總是樂於接受建議並改進我的代碼。如果你不介意詳細說明或發佈一個鏈接,我可以學習我會很感激=) – shload

+0

訪問維基百科文章(http://en.wikipedia.org/wiki/SQL_injection)瞭解SQL注入信息。你可以像下面這樣在Python中對int進行類型轉換: int(some_user_input) – atx