我有这个配置: 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后会搞砸了
答案 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]
也必须引用。