python和mysql.connector需要在中引用未签名的

2024-04-25 01:45:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是mysql连接器1.0.9。以及python3.2

由于语法错误,此查询失败(mysql.connector抛出ProgrammingError,具体的MySQL错误是“在“%(IP)s和DATE_SUB(NOW(),INTERVAL 1 HOUR)<;access右侧有语法错误”:

SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed

但如果我引用变量IP,它是有效的:

^{pr2}$

在上下文中:

IP = 1249764151  # IP converted to an int
conn = mysql.connector.connect(db_params)
curs = conn.cursor()
query = "SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed"
params = {'IP', IP}
curs.execute(query, params)

我的理解是,您永远不必为准备好的语句引用变量(对于我代码中的每个其他查询都是如此,即使是访问此表上的IP变量的查询)。为什么我需要引用它在这个单一的例子,而没有其他地方?在

如果这不是一个事先准备好的声明,我也有兴趣听听。我没能注入任何东西-它只是引用它的方式来阻止它吗?在

如果重要的话,以下是表格说明:

+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| IP       | int(10) unsigned | YES  |     | NULL    |       |
| user_id  | int(11)          | YES  |     | NULL    |       |
| accessed | datetime         | YES  |     | NULL    |       |
+----------+------------------+------+-----+---------+-------+

Tags: ipconnectordatemysqlparamsselectnullnow
1条回答
网友
1楼 · 发布于 2024-04-25 01:45:05

不要使用字符串插值。将SQL参数保留给数据库适配器:

cursor.execute('''\
    SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed''', (ip,))

这里,我们将参数ip作为一个单独的参数传递给execute()调用(在元组中,使其成为一个序列),数据库适配器将负责正确的引用,填充%s占位符。在

相关问题 更多 >