Вопрос

Как лучше всего хранить IP-адреса с помощью PHP в базе данных MySQL?Есть функция под названием ip2long - но это только для IPv4.Но как насчет IPv6?

Я знаю функцию php, которая предназначена для IP-адресов IPv6, но она не работает в Windows с PHP < Версия 5.3

Это было полезно?

Решение

Десятичный IPv4-адрес с запятой может быть преобразован в целое число с максимальным размером 32 бита.IPv6-адреса состоят из 128 бит.Поскольку 128 бит не помещаются в PHP int, работать с этим в PHP будет непросто.

Если вы просто хотите подключиться и использовать IPv6-адреса, избавьте себя от лишних хлопот и сохраните их в виде текста.Если вы хотите применить сетевые маски и вычислить подсети, то вам необходимо преобразовать их.

Другие советы

вязаный было ближе, вместо двоичного файла (16) использовать varbinary(16) как user196009 ответил в связанном с этим вопросе.У меня это работает.Каким образом?

Хранение 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).Я не эксперт, поэтому пока не знаю, правильна ли длина переменной, но, как я уже сказал, у меня это работает.

Для того, чтобы проверить, включена ли "Поддержка IPv6" в вашей версии PHP / host:

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

есть функция php inet_pton, это превратит строку ip-адреса в его двоичное представление (как для ipv4, так и для ipv6).затем вы можете сохранить его как binary(16) в вашей базе данных mysql.

чтобы снова получить понятный человеку адрес, используйте inet_ntop

Обратите внимание , что MySQL (5.6) теперь поддержка Адреса IPv6, видеть INET6_ATON().

По второму комментарию на ip2long руководство по эксплуатации у вас есть функция, вызываемая ip2long6 для IPv6 (и это еще не все ниже).

Вы могли бы просто сохранить его в виде строки в CHAR Я полагаю

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top