2010-01-12 18 views
15

¿Cuál es la mejor práctica para almacenar direcciones IP con PHP en la base de datos MySQL? Hay una función llamada ip2long, pero esto es solo para IPv4. Pero, ¿qué pasa con IPv6?Tienda IPv6 en la base de datos

sé una función php que es para IPv6 IP, pero no funciona en Windows con PHP < Versión 5.3

+3

Consulte esta pregunta: http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql –

Respuesta

9

La dirección IPv4 decimal con puntos se puede convertir en un entero, con un tamaño máximo de 32 bits. Las direcciones IPv6 son de 128 bits. Como 128 bits no caben en PHP int, será un dolor trabajar con esto en PHP.

Si solo desea conectarse y usar direcciones IPv6, ahórrese el problema y guárdelas como texto. Si desea aplicar máscaras de red y calcular subredes, debe convertirlas.

+0

¿Qué tamaño de texto? – User

+4

[45 caracteres] (http://stackoverflow.com/questions/166132/maximum-length-of-the-textual-representation-of-an-ipv6-address). – Sjoerd

0

En segundo comentario en ip2long manual de función tiene una función llamada ip2long6 para IPv6 (y hay más abajo).

+0

tenga en cuenta que necesita gmp-lib para esa función –

0

Se podía almacenar como una cadena en un CHAR supongo

9

existe la función php inet_pton, convertirá una cadena de dirección IP en su representación binaria (tanto para ipv4 como para ipv6). luego puede almacenarlo como binary(16) en su base de datos mysql.

para obtener una dirección legible por el hombre nuevo, utilice inet_ntop

12

knittl estaba más cerca, en lugar de binario (16) utilizan varbinary (16) como user196009 answered en una pregunta relacionada. Esto funciona para mi. ¿Cómo?

Almacenamiento 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 
?> 

Recuperando 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 
?> 

Se debe trabajar con direcciones IPv6 (tengo una conexión IPv4). No soy un experto, así que no sé si la longitud varbinary es correcta, pero como dije, me funciona.

Con el fin de comprobar si 'Soporte IPv6' está habilitado en su versión de PHP/host:

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

En lugar de usar PHP, ahora puede usar MySQL [INET6_ATON] (http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton) para convertir la cadena a su valor numérico representación para MySQL> = 5.6. – Mike

2

Tenga en cuenta que MySQL (5.6) Ahora Soporte direcciones IPv6, ver INET6_ATON().

Cuestiones relacionadas