我正在使用 mysql 连接器 1.0.9。和 Python 3.2
此查询因语法错误而失败(mysql.connector 抛出 ProgrammingError,具体的 MySQL 错误只是“%(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) 右侧存在语法错误<访问“:
SELECT COUNT(*) FROM bad_ip_logins WHERE IP = %(IP)s AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed
但是,如果我引用变量 IP,它会起作用:
SELECT COUNT(*) FROM bad_ip_logins WHERE IP = '%(IP)s' AND DATE_SUB(NOW(), INTERVAL 1 HOUR) < accessed
在上下文中:
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 | |
+----------+------------------+------+-----+---------+-------+