使用inet_pton()PHP函数的错误字符*不是Zend * Piwik location_ip问题

时间:2011-09-07 15:22:31

标签: php mysql character-encoding matomo

我正在尝试与我们在服务器上安装的Piwik数据库进行交互。在Piwik数据库中,使用inet_ntop()插入存储的ip地址的值。我正在尝试解码这些值并使用inet_pton()将它们拉出来,这样我就可以运行查询来查找Piwik数据库中存储在本地数据库中的客户IP地址。

当我构建查询时,问题就出现了。我在db中获取存储的地址并通过inet_pton()运行它,如此...

$data = mysql_fetch_assoc(mysql_query("SELECT ip_address FROM data_table WHERE id = 1"));

$more_data = mysql_fetch_assoc(mysql_query("SELECT location_ip FROM piwik_log_visit WHERE location_ip = '".inet_pton($data['ip_address'])."'"));

问题出在哪里是inet_pton($ data ['ip_address'])会显示包含黑钻石问号的随机字符(有时)。它返回一个mysql_error,表示查询无效(因为字符不正确)。我尝试添加mysql_set_charset(“utf8”);在运行查询之前没有(好)结果。

任何想法?

谢谢!

2 个答案:

答案 0 :(得分:2)

$data = mysql_fetch_assoc(mysql_query("SELECT ip_address FROM data_table WHERE id = 1"));
$hexip = bin2hex(inet_pton($data['ip_address']));
$more_data = mysql_fetch_assoc(mysql_query("SELECT location_ip FROM piwik_log_visit WHERE hex(location_ip) = '$hexip'"));

为了让mysql和php不抛出错误,你需要将inet_pton的二进制输出转换为十六进制,然后将mysql存储的十六进制(location_ip)值与$ hexip变量进行比较。

答案 1 :(得分:1)

二进制故事:

$bin_ip = '0x'.bin2hex(inet_pton($data['ip_address']));

"SELECT location_ip FROM piwik_log_visit WHERE hex(location_ip) = $bin_ip"