2010-01-12 9 views
15

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

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

+3

Отметьте этот вопрос: http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql –

ответ

9

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

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

+0

Какой размер текста? – User

+4

[45 символов] (http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address). – Sjoerd

0

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

+0

помните, что вам нужна gmp-lib для этой функции –

0

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

9

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

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

12

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

Запоминание 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 
?> 
+2

Вместо использования PHP вы можете теперь использовать [INET6_ATON] MySQL (http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton), чтобы преобразовать строку в ее числовую представление для MySQL> = 5.6. – Mike

2

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

 Смежные вопросы

  • Нет связанных вопросов^_^