Python MySQLdb WHERE SQL LIKE

时间:2012-06-05 19:17:37

标签: python mysql mysql-python

我最近开始学习用于Web的Python和MySQL,我遇到了以下问题:

我想从mysql数据库中提取一条记录,其中包含我在param部分中输入的任何文本,但是在进行查询时我遇到了以下问题:

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()

提前致谢。

3 个答案:

答案 0 :(得分:33)

直接将数据插入SQL字符串不是最好的方法,因为它很容易SQL injection。您应该将其更改为:

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

答案 1 :(得分:1)

更好的方法(更安全),而不是使用字符串作为 "%" + param + "%" 将使用另一个 % 转义模板字符串中的 % 字符(因此,%% ),所以它会是:

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

答案 2 :(得分:0)

您没有使用正确的参数。 Python期望在该区域('%s%___')中使用另一个限定符来进行字符串替换。这也是易受攻击的代码。正确的方法看起来更像是:

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