PHP/MySQLセットアップでIPv4アドレスとIPv6アドレスを保存する最善の方法については、何百万もの質問がありますが、古くなった(IPv4のみ)か、矛盾しています/不完全な。IPv4アドレスとIPv6アドレスの保存と取得
私はあなたに知っておく必要があるすべてを提供する明確な答えを得るためにこの質問を作成しました。
PHP/MySQLセットアップでIPv4アドレスとIPv6アドレスを保存する最善の方法については、何百万もの質問がありますが、古くなった(IPv4のみ)か、矛盾しています/不完全な。IPv4アドレスとIPv6アドレスの保存と取得
私はあなたに知っておく必要があるすべてを提供する明確な答えを得るためにこの質問を作成しました。
IPv4について心配する必要があるときは、PHPのip2long
とlong2ip
を使用すると、IPアドレスを素早く簡単に整数に変換できます。しかし、今日では、ほぼすべての人が、ある時点でいくつかのIPv6アドレスに出くわすことを期待しなければなりません。両方を持つ
一般的かつ効率的な解決策は、(IPv4とv6の両方を処理する)PHPのinet_pton functionを使用し、その後、データベースにVARBINARY(16)
列に結果を格納することです。
それでは、私たちは次のようにIPv6アドレスを持っているとしましょう:inet_pton
に変換され、それはこのようになりますVARBINARY(16)
列に格納されている場合はFE80:0000:0000:0000:0202:B3FF:FE1E:8329
:
0xfe800000000000000202b3fffe1e8329
あなたは、その後からこれを取得することができますデータベースを表示し、inet_ntop
を使用して表示します。
例:
echo inet_ntop($ipAddressFromDB);
これは、MySQLデータベース内のIPアドレスを格納するための迅速かつ効率的な方法です。
IPv6に対応するためのアプリケーションを構築していない場合は、この時点ではあなた自身に不利益を与えています。これは時間が経つにつれてますます真実になるでしょう。このため、すべてののIPアドレスをIPv6形式で保存し始め、6to4というIPv4アドレスの表記を使用し始めました。
TL、6to4のためのDRである:接頭辞の
]この目的のために重要なので、我々はによって6to4の表記にあることを変換する、のは、あなたのIPアドレスが最初の16ビットは常に2002である:、次の32ビットは、IPv4アドレスであり、プレフィックスの最後の16ビットが[ありませんなる
sprintf('2002:%s::', implode(':', str_split(str_pad(dechex(ip2long($addr)), 8, '0', STR_PAD_LEFT), 2)));
:
222.173.190.239
あるとしましょう:簡単に保存可能な、検索する必要があります
0x200200de00ad00be00ef000000000000
:16バイトのバイナリを提供しますinet_pton('2002:de:ad:be:ef::');
:あなたがして、ストレージ用のバイナリ形式に変換する2002:de:ad:be:ef::
。
私はこれまでにヘルパークラスを作成しましたが、他の人が役に立つと思うように、GithubとPackagistにプッシュしました。
MySQL自体には同等の機能[INET_ATON() '](https://dev.mysql.com/doc/en/miscellaneous-functions.html#function_inet-aton)と[' INET_NTOA() '](https ://dev.mysql.com/doc/en/miscellaneous-functions.html#function_inet-ntoa)、[v5.6.3以降](https://dev.mysql.com/doc/relnotes/mysql/) 5.6/ja/news-5-6-3.html)、['INET6_ATON()'](https://dev.mysql.com/doc/en/miscellaneous-functions.html#function_inet6-aton)および[' INET6_NTOA() '](https://dev.mysql.com/doc/en/miscellaneous-functions.html#function_inet6-ntoa)を使用してください。 – eggyal
残念ながら、ip2longとlong2ipについて心配する必要はありませんでした。 eggyalはmysql関数もあると言っていますが、後者は(正しく)署名されていませんが、前者は署名されています。互換性がない。 – symcbean