2012-06-05 55 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