【问题标题】:mysql query from python returning no results来自python的mysql查询没有返回结果
【发布时间】:2018-03-22 13:46:40
【问题描述】:

所以我已经查看了文档和其他问题,但我没有运气。

当我运行 c.execute 并使用值编码的第一个 %s 时,它可以工作。然而,如果我试图让它成为一个变量,我不会得到任何结果。据我了解,我将 use %s 作为占位符,然后将这些变量的列表作为第二个参数传递。我错过了什么吗?在这种情况下,来自 db_connect 的游标是 conn.cursor(cursors.DictCursor) 因为我想要一个结果字典。无论哪种方式,我在 a 或 b 中都没有得到任何结果,但是如果我使用“SELECT * FROM users where username = %s”运行相同的查询,那么我会得到一个结果。

from MySQLdb import escape_string
from db_connect import connection
import gc

def get_user(parameter, value):
    c, conn = connection(dict_cursor = True)
    data = c.execute("SELECT * FROM users where %s = %s",[escape_string(parameter), escape_string(value)])
    data = c.fetchone()
    conn.close()
    gc.collect()
    return data

a = get_user("username","testuser")
b = get_user("email","testuser@icloud.com")
c = get_user("username","doesntexist")

【问题讨论】:

    标签: python mysql sql


    【解决方案1】:

    我错过了什么吗?

    是的。您可以用参数替换查询中的常量。但是,您不能替换标识符。这包括:

    • 表名
    • 列名
    • 函数名称
    • 运营商
    • SQL 关键字

    您可以做的是用字符串替换替换列名,然后将比较值作为参数传递。

    【讨论】:

    • 在这种情况下,我可以这样做: data = c.execute("SELECT * FROM users where "+parameter+"= %s",[escape_string(value)]) 吗?这是安全的,因为它周围没有 escape_string 或任何东西吗?
    • @GeorgeLingo 。 . .唉,它不安全。替换查询字符串中的标识符是参数化 SQL 中的一个安全漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2013-07-05
    • 2014-11-08
    • 2016-08-22
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多