2012-06-05 211 views
5

我最近開始學習Python和MySQL的Web目的,我遇到了如下問題:Python的MySQLdb的WHERE SQL LIKE

我想從一個MySQL數據庫的一個記錄拉出任何包含文本,我在參數部分輸入,howerver我想提出一個查詢時遇到了以下問題:

traceback (most recent call last): 
    File "/Users/Strielok/Desktop/test.py", line 13, in <module> 
    c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1" % (param)) 
TypeError: not enough arguments for format string 

這裏是我的代碼:

import MySQLdb 



db = MySQLdb.connect (host = "localhost", 
          user = "root", 
          passwd = "root", 
          db = "test") 
param = "Test" 

par = param 

c = db.cursor() 

c.execute("SELECT * FROM data WHERE params LIKE ('%s%') LIMIT 1" % (param)) 


data = c.fetchall() 
print data 

c.close() 

在此先感謝。

回答

25

將數據直接插入SQL字符串不是做到這一點的最好辦法,因爲很容易出現SQL injection。你應該把它改成這樣:

c.execute("SELECT * FROM data WHERE params LIKE %s LIMIT 1", ("%" + param + "%",))

+0

糟糕,你完全正確@univerio。刪除我的答案,你的更好。 –

+0

謝謝,你的解決方案是最好的,我喜歡這個部分「(」%「+ param +」%「,)」 –

0

您沒有使用正確的參數。 Python期待在這方面('%s%___')另一個限定符爲了做一個字符串替換。這也是易受攻擊的代碼。這樣做的正確方法看起來更像是:

c.execute("SELECT * FROM data WHERE params LIKE '%%s%' LIMIT 1",(param,))

+0

我不認爲這將導致相同的查詢。最後一個字符串將包含%param%的LIKE子句,而不是@univerio的意圖。 –

+0

你是對的 - 明確監督 – swasheck