Какова наилучшая практика для хранения IP-адресов с PHP в базе данных MySQL? Есть функция ip2long – но это только для IPv4. Но как насчет IPv6?
Я знаю php-функцию, предназначенную для IPv6-IP, но она не работает в Windows с PHP <Version 5.3
Пунктирно-десятичный IPv4-адрес может быть преобразован в целое число с максимальным размером 32 бит. Адреса IPv6 составляют 128 бит. Поскольку 128 бит не подходят в PHP int, это будет болью для работы с PHP.
Если вы просто хотите подключиться и использовать адреса IPv6, сохраните проблему и сохраните их в виде текста. Если вы хотите применить сетевые маски и рассчитать подсети, вам необходимо их преобразовать.
knittl был ближе, вместо двоичного (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). Я не эксперт, поэтому я еще не знаю, соответствует ли длина varbinary, но как я сказал, это работает для меня.
Чтобы проверить, включена ли поддержка IPv6 в вашей PHP-версии / хосте:
<?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 () .
Во втором комментарии в руководстве по функциям ip2long6
у вас есть функция ip2long6
для IPv6
(а также ниже).
Вы можете просто сохранить его как строку в CHAR
я полагаю