2012-05-14 21 views
6

Ok, ahora soy consciente de que probablemente se han hecho preguntas similares un millón de veces, pero soy un verdadero novato en esto y agradecería su ayuda.Almacenando la dirección IP en la base de datos MySQL (IPv4 e IPv6)

Básicamente, quiero almacenar la dirección IP de los visitantes en MySQL para su posterior recuperación y verificación. Primero necesito saber qué tipo de campo necesito usar para almacenar la dirección IP. También me gustaría hacer que el sistema sea compatible con las direcciones IPv6 si es posible.

Gracias de antemano

+1

¿Cuáles son sus principales casos de uso de las direcciones? ¿Vas a consultarlos? Dividirlos y consultar de acuerdo a algunas reglas de subredes? ¿O están almacenados solo para exhibición? –

+2

Pruebe esto: http://stackoverflow.com/questions/2049681/store-ipv6-in-database – Mark

+0

Bueno, es un enlace de confirmación. Quiero asegurarme de que el enlace de confirmación se haya visitado desde la misma dirección IP en la que se generó. Así que voy a consultarlos] – Andy

Respuesta

9

Para almacenar una dirección IPv4 se puede utilizar un INT UNSIGNED , mientras que para un IPv6 necesita un decimal(39,0), para almacenar una ip en la tabla se puede utilizar la función de INET_ATON:

INSERT INTO table (ipcol) VALUES (INET_ATON('192.168.0.10')); 

y recuperar de nuevo con la función INET_NTOA:

SELECT INET_NTOA(ipcol) AS ip FROM table; 

Esto respondió antes de la compatibilidad con MySQL IPv6; los usuarios deben saber que MySQL ahora es compatible nativamente con IPv6:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html

+0

Gracias, pero creo que acabo de leer que 'INET_ATON()' no es compatible con IPv6. Y aunque lo hiciera, ¿cómo obtengo la dirección IPv6 usando PHP? – Andy

+0

Pruebe con inet_pton: http://php.net/manual/en/function.inet-pton.php – aleroot

+0

Bastante, gracias. Ahora, ¿cómo hago para encontrar la dirección IP de los usuarios en PHP? – Andy

1

No hay ningún tipo integral en MySQL lo suficientemente grande para almacenar una dirección IPv6. La forma más compacta de almacenarlo es algo así como BINARY(16). Si solo necesita almacenar y recuperar direcciones y no necesita realizar operaciones lógicas en ellas (por ejemplo, operaciones de máscara de red para consultar para qué direcciones IP están bajo un prefijo de cobertura), entonces eso será suficiente. Si necesita realizar operaciones lógicas o de bits, deberá ser más elegante: deberá almacenar las direcciones IPv6 en dos columnas enteras de 64 bits.

+0

No, no necesito hacer nada más elegante (solo recuperarlos/compararlos en una consulta). Entonces, ¿todo lo que necesito saber ahora es cómo puedo obtener la dirección IP del usuario usando PHP? – Andy

4

utilizo VARBINARY (16) para el tipo de datos y utilizar la función de MySQL INET_ATON() para insertar el número de IP (que más tarde leí el uso de la función inversa, INET_NTOA().

+0

Entonces, ¿VARBINARIO (16) admitirá tanto IPv4 como IPv6? ¿Y cómo puedo encontrar la dirección IP de los visitantes usando PHP? – Andy

+1

Tienes que usar INET6_NTOA e INTE6_ATON, pero esto no está disponible en MySQL hasta la versión 5.6.3 –

Cuestiones relacionadas