2013-05-27 21 views
1

我有這樣的配置: MySQL的:5.1.66-0 + squeeze1日誌, PHP:5.3.3-7 + squeeze15,MySQL或PHP錯誤? IPV6

我工作wtih IPv6地址2001:35c::/40

雖然我「M在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); 

另外我發現,那裏有ar在插入到MySQL後,它會被搞亂。

+0

你確定在這個'$ address = inet_ntop(inet_pton($ address));''$ address =='2001:35c ::/40''之後嗎? – Voitcus

+0

'$ addr ='2001:35c ::/40'; $ addr = explode('/',$ addr); $ addr [0] = inet_ntop(inet_pton($ addr [0])); $ addr = implode('/',$ addr); echo $ addr;'result:'2001:35c ::/40' – nn4n4s

+2

我沒有得到的是你將它轉換3次來回o_o? – HamZa

回答

2

嘗試在插入前引用數據。

MySQL的

mysql_real_escape_string(inet_pton($address)) 

PDO

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

這種方法也難逃二進制數據,0變成\ 0等

@哈姆扎 - dzcyberdev我猜三重轉換是獲得最短的IPv6符號。 0000:0000可以縮寫爲::,0000:到0:在這種情況下不介意,但可能在其他情況下。

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]必須用引號括也。