10

我最近开始为网络目的学习 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()

提前致谢。

4

3 回答 3

46

直接将数据插入到 SQL 字符串中并不是最好的方法,因为它容易发生SQL 注入。你应该把它改成这样:

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

于 2012-06-05T19:24:02.597 回答
1

一种更好的方法(并且更安全),而不是使用字符串来"%" + param + "%"%模板字符串中的 char 与另一个%(so, %%) 一起转义,所以它将是:

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

于 2021-01-05T14:54:43.223 回答
0

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

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

于 2012-06-05T19:22:58.627 回答