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

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

15 голосов
/ 12 января 2010

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

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

Ответы [ 6 ]

12 голосов
/ 12 декабря 2010

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

Хранение 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
?> 
9 голосов
/ 03 мая 2010

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

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

9 голосов
/ 14 января 2010

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

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

2 голосов
/ 24 апреля 2016

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

0 голосов
/ 12 января 2010

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

0 голосов
/ 12 января 2010

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

...