MySQL还是PHP错误? IPV6

时间:2013-05-27 07:50:10

标签: php mysql networking ipv6

我有这个配置: MySQL:5.1.66-0 + squeeze1-log, PHP:5.3.3-7 + squeeze15,

我正在使用ipv6地址2001:35c::/40

工作

虽然我在php(inet_pton,inet_ntop)上操作它很好,但是在我将它放入MySQL数据库(VARBINARY(16)字段后,它变得混乱(200103000000000000000000000000而不是2001035c0000000000000000000000)。哪个可能是问题?

$addr = '2001:35c::/40';

$addr = explode('/', $addr);
$address = $addr[0];

$address = inet_ntop(inet_pton($address));

$sql = "INSERT INTO IPv6 (IP, Mask, Parent_ID) VALUES ('".inet_pton($address)."', '".$addr[1]."', 0)";
$DB=new Database();
$DB->query($sql);

我也发现,地址(ipv6)中有35c parti,插入MySQL后会搞砸了

2 个答案:

答案 0 :(得分:3)

在插入之前尝试引用您的数据。

<强>的MySQL

mysql_real_escape_string(inet_pton($address))

<强> PDO

$db->quote(inet_pton($address))

此方法也转义二进制数据,0变为\ 0等

@ hamza-dzcyberdev我猜三重转换是为了获得最短的IPv6表示法。 0000:0000可缩短为::,0000:0:在这种情况下不介意,但可能在其他情况下。

答案 1 :(得分:0)

您可以使用',而不是引用mysql_real_escape_string()quote()0x,以便查询看起来像

INSERT INTO IPv6 (IP, Mask, Parent_ID) VALUES (0x2001035c0000000000000000000000, 40, 0).

但是,我不确定如何在PHP中处理这个问题。也许(但不能保证!)这样:

$sql = "INSERT INTO IPv6 (IP, Mask, Parent_ID) VALUES (0x".bin2hex($address).", '".$addr[1]."', 0)";

根据$addr的来源,$addr[1]也必须引用。