我已经尝试了很多次使用不同的代码在mysql int unsigned 字段中插入 IP 地址,请提供任何指针,我已经查看了谷歌上的所有示例,没有任何帮助
这是我的代码
icecast_source_ip = "INET_ATON('" + icecast_source_ip +"')"
print icecast_source_ip
cnx = mysql.connector.connect(host=mysql_remote_host,
user=mysql_remote_host_user,
password=mysql_remote_host_password,
database=mysql_remote_host_database)
cursor = cnx.cursor()
cursor.execute("INSERT INTO icecast_monitor.status_log
(website_online, icecast_source_online, icecast_source_ip,
icecast_no_listeners, centerpoint_online, centerpoint_connection,
horsleypark_online, horsleypark_connection, system_ok)
VALUES ('" + website_online + "','"
+ icecast_source_online + "','"
+ icecast_source_ip + "','"
+ icecast_no_listeners + "','"
+ centerpoint_online + "','"
+ centerpoint_connection + "','"
+ horsleypark_online + "','"
+ horsleypark_connection + "','"
+ system_ok + "')
")
print 'Data inserted into Database'
cnx.commit()
cursor.close()
cnx.close()
和我得到的错误
意外错误 1064 (42000(:SQL 语法有错误; 检查与您的 MySQL 服务器版本对应的手册以了解 在附近使用的正确语法 第 1 行的"60.241.175.9"("、"19"、"真"、"主"、"真"、"主"、"假"(">
如注释中所述,您没有引用值,因此 IP 地址等字符串在最终 SQL 查询中没有所需的单引号。
正确且安全的方法是使用参数化查询。您无需担心引用,也无需担心使用字符串操作手动构造查询字符串时可能出现的 SQL 注入漏洞。对于您的示例,您可以这样做:
query = """INSERT INTO icecast_monitor.status_log
(website_online, icecast_source_online, icecast_source_ip,
icecast_no_listeners, centerpoint_online, centerpoint_connection,
horsleypark_online, horsleypark_connection, system_ok)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"""
cursor.execute(query, (website_online, icecast_source_online, icecast_source_ip, icecast_no_listeners, centerpoint_online, centerpoint_connection, horsleypark_online, horsleypark_connection, system_ok))
这使用占位符%s
来指示应插入参数的位置,然后cursor.excute()
在发送查询执行之前将参数插入第二个参数中,并在查询中正确引用。
问题在于变量 icecast_source_ip
的值。
您的 soure ip 值变量周围已经有单引号。
icecast_source_ip = "INET_ATON('" + icecast_source_ip +"')"
但是在查询中使用它时,您再次用引号将生成的字符串括起来。生成的查询如下所示:
// + "','" + icecast_source_ip + "','"
+ "','"+ INET_ATON(' + 60.241.175.9 + ') + "','"
为了便于阅读,字符串替换如下所示:
+ "','INET_ATON('60.241.175.9')','"
因此,实际的 IP 地址值60.241.175.9
没有引起来,sql 引擎试图将其识别为标识符,但失败了,因为它的格式错误,因此是语法错误。
请使用准备好的声明来克服这些问题。