将IP地址插入mysql时出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将IP地址插入mysql时出错相关的知识,希望对你有一定的参考价值。

我已尝试多次使用不同的代码在mysql int unsigned field中插入一个ip地址,请指点,我看了google上的所有例子,没有什么帮助

这是我的代码

    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服务器版本对应的手册,以便在'60 .241.175.9')','19','True','Main','True','Main','False'附近使用正确的语法。)'在第1行

答案

如评论中所述,您没有引用这些值,因此诸如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的值。 您已经有源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引擎试图将其识别为标识符但因为格式错误而失败,因此是语法错误。

请使用准备好的陈述来克服这些问题。

以上是关于将IP地址插入mysql时出错的主要内容,如果未能解决你的问题,请参考以下文章

CentOS下mysqld启动失败

java中使用mysql批量插入大文本(二进制)数据时出错

在我的“设置”片段中膨胀类 PreferenceScreen 时出错

插入 MySQL 时出错

将代码片段插入数据库并在 textarea 中以相同方式显示

将数据从一个片段发送到另一个片段时出错。 (两个片段都由一个活动托管)