在MySQL數據庫中使用PHP存儲IP的最佳實踐是什麼? 有一個稱爲ip2long的函數 - 但這僅適用於IPv4。 但是IPv6呢?在數據庫中存儲IPv6
我知道一個PHP函數,對IPv6的IP的, 但它不能在Windows與PHP <版本5.3
在MySQL數據庫中使用PHP存儲IP的最佳實踐是什麼? 有一個稱爲ip2long的函數 - 但這僅適用於IPv4。 但是IPv6呢?在數據庫中存儲IPv6
我知道一個PHP函數,對IPv6的IP的, 但它不能在Windows與PHP <版本5.3
點分十進制IPv4地址可以被轉換成整數,具有32位的最大尺寸。 IPv6地址是128位。由於128位不適合PHP int,所以在PHP中使用這將會很麻煩。
如果您只想連接並使用IPv6地址,請將問題保存並保存爲文本。如果你想應用網絡掩碼和計算子網,那麼你需要轉換它們。
你可以只將其存儲爲一個CHAR
字符串我想
這裏有php函數inet_pton
,它會將一個ip地址字符串變成它的二進制表示(對於ipv4和ipv6)。你可以將它作爲binary(16)
存儲在你的mysql數據庫中。
再次獲得人類可讀地址,使用inet_ntop
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
?>
現在,您可以使用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
注意MySQL的(5.6)現在支持IPv6地址,看到INET6_ATON()。
看看這個問題:http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql – 2010-01-12 14:39:06