2010-01-12 102 views
15

在MySQL數據庫中使用PHP存儲IP的最佳實踐是什麼? 有一個稱爲ip2long的函數 - 但這僅適用於IPv4。 但是IPv6呢?在數據庫中存儲IPv6

我知道一個PHP函數,對IPv6的IP的, 但它不能在Windows與PHP <版本5.3

+3

看看這個問題:http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql – 2010-01-12 14:39:06

回答

9

點分十進制IPv4地址可以被轉換成整數,具有32位的最大尺寸。 IPv6地址是128位。由於128位不適合PHP int,所以在PHP中使用這將會很麻煩。

如果您只想連接並使用IPv6地址,請將問題保存並保存爲文本。如果你想應用網絡掩碼和計算子網,那麼你需要轉換它們。

+0

什麼大小的文字? – User 2012-10-09 16:52:21

+4

[45個字符](http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address)。 – Sjoerd 2012-10-10 07:16:56

0

ip2long功能手冊上工作的第二個意見,你有一個名爲ip2long6IPv6功能(和下面還有更多)。

+0

請注意,您需要該功能的gmp-lib – 2010-01-12 16:55:04

0

你可以只將其存儲爲一個CHAR字符串我想

9

這裏有php函數inet_pton,它會將一個ip地址字符串變成它的二進制表示(對於ipv4和ipv6)。你可以將它作爲binary(16)存儲在你的mysql數據庫中。

再次獲得人類可讀地址,使用inet_ntop

12

knittl更接近,在一個相關的問題,而不是二進制(16)用VARBINARY(16)user196009 answered。這個對我有用。怎麼樣?

貯藏IP:

<?php 
    $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google's IP address 
    // using a PDO wrapper. http://www.phpclasses.org/package/5206-PHP-Execute-database-queries-from-parameters-using-PDO.html 
    include_once 'db.php'; 
    $c = new DB(); 
    $visit = $c->getResults($query); // stored as binary 
?> 

獲取IP:

<?php 
    $query = "SELECT `vis_ip` FROM `stats` WHERE `id_stat`=1"; 
    // PDO wrapper 
    include_once 'db.php'; 
    $c = new DB(); 
    $stats = $c->getRow($query); 
    echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104 
?> 

應該使用IPv6地址的工作(我有一個IPv4連接)。 我不是專家,所以我不知道如果varbinary長度是正確的,但我怎麼說,它適用於我。

爲了檢查是否 'IPv6支持' 在你的PHP版本/主機啓用:

<?php 
    phpinfo(INFO_GENERAL); // http://php.net/manual/es/function.phpinfo.php 
?> 
+2

現在,您可以使用MySQL的[INET6_ATON](http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton)將字符串轉換爲其數字MySQL> = 5.6的表示。 – Mike 2014-06-21 17:20:53

2

注意MySQL的(5.6)現在支持IPv6地址,看到INET6_ATON()