【问题标题】:Python MySQLdb WHERE SQL LIKEPython MySQLdb WHERE SQL LIKE
【发布时间】:2012-06-09 20:04:03
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: python mysql mysql-python


    【解决方案1】:

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

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

    【讨论】:

    • 哎呀,你是完全正确的@univerio。删除我的答案,你的更好。
    • 谢谢,你的解决方案是最好的,我喜欢这个部分" ("%" + param + "%",)"
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我认为这不会导致相同的查询。最终的字符串将是 %param% 的 LIKE 子句,而不是 @univerio 打算的 param%。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多