15


7

データベースにIPv6を保存する

PHPでIPをMySQLデータベースに保存するためのベストプラクティスは何ですか? ip2longという関数がありますが、これはIPv4専用です。 しかし、IPv6はどうでしょうか?

IPv6 IP用のphp関数は知っていますが、PHP <バージョン5.3のWindowsでは機能しません

6 Answer


12


knittlはより近く、binary(16)の代わりにvarbinary(16)をuser196009として使用しますhttps://stackoverflow.com/関連する質問のquestions / 1120371 / how-to-convert-ipv6-from-binary-for-storage-in-mysql / 1619332#1619332 [answered]。 わたしにはできる。 How?

IPの保存:

getResults($query); // stored as binary
?>

IPの取得:

getRow($query);
  echo inet_ntop($stats->vis_ip); // outputs 66.102.7.104
?>

IPv6アドレスで動作するはずです(私はIPv4接続を持っています)。 私は専門家ではないので、varbinaryの長さが正しいかどうかはまだわかりませんが、私が言ったように、それは私にとってはうまくいきます。

PHPバージョン/ホストで「IPv6サポート」が有効になっているかどうかを確認するには:



9


ドット付き10進数のIPv4アドレスは、最大サイズが32ビットの整数に変換できます。 IPv6アドレスは128ビットです。 128ビットはPHPのintに収まらないため、PHPで作業するのは面倒です。

接続してIPv6アドレスを使用するだけの場合は、トラブルを回避し、テキストとして保存してください。 ネットマスクを適用してサブネットを計算する場合は、それらを変換する必要があります。


9


php関数http://php.net/inet_pton [inet_pton]があり、IPアドレス文字列をバイナリ表現に変換します(ipv4とipv6の両方)。 その後、mysqlデータベースに `binary(16)`として保存できます。

人間が読めるアドレスを再度取得するには、「inet_ntop」を使用します


2


  • MySQL (5.6)が IPv6アドレス*をサポートするようになったことに注意してください。http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html [INET6_ATON()]を参照してください。


0


http://php.net/manual/en/function.ip2long.php [ip2long]関数マニュアルの2番目のコメントには、「IPv6」用の「ip2long6」という関数があります(さらに以下にあります)。


0


あなたはそれを文字列として `CHAR`に保存することができます