Подтвердить что ты не робот

Хранить IPv6 в базе данных

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Сохранение IP:

<?php
  $query = "insert into stats(vis_ip, id_stat) values('" . inet_pton('66.102.7.104') . "', '1')"; // google 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
?> 

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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