2010-01-12 20 views
15

Qual è la migliore pratica per archiviare gli IP con PHP nel database MySQL? C'è una funzione chiamata ip2long - ma questo è solo per IPv4. Ma per quanto riguarda IPv6?Store IPv6 nella banca dati

so una funzione php che per IPv6 IP, ma non funziona su Windows con PHP < Versione 5.3

+3

Dai un'occhiata a questa domanda: http://stackoverflow.com/questions/1120371/how-to-convert-ipv6-from-binary-for-storage-in-mysql –

risposta

9

L'indirizzo IPv4 decimale puntata può essere convertito in un numero intero, con una dimensione massima di 32 bit. Gli indirizzi IPv6 sono 128 bit. Poiché 128 bit non si adattano a un PHP int, questo sarà un problema con PHP.

Se si desidera semplicemente connettersi e utilizzare gli indirizzi IPv6, risparmiatevi i problemi e salvateli come testo. Se si desidera applicare maschere di rete e calcolare le sottoreti, è necessario convertirle.

+0

Che tipo di testo? – User

+4

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

0

Sul secondo commento a ip2long manuale funzione si dispone di una funzione chiamata ip2long6 per IPv6 (e ci sono più sotto).

+0

attenzione che hai bisogno di gmp-lib per quella funzione –

0

Si potrebbe semplicemente memorizzarlo come una stringa in un CHAR immagino

9

c'è la funzione php inet_pton, trasformerà una stringa di indirizzo ip nella sua rappresentazione binaria (sia per ipv4 che per ipv6). puoi quindi memorizzarlo come binary(16) nel tuo database mysql.

per ottenere un indirizzo leggibile ancora una volta, utilizzare inet_ntop

12

knittl era più vicino, invece di binario (16) utilizzare varbinary (16) come user196009 answered in una questione connessa. Per me funziona. Come?

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

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

Dovrebbe funzionare con gli indirizzi IPv6 (ho una connessione IPv4). Non sono un esperto quindi non so ancora se la lunghezza varbinary è corretta, ma come ho detto, funziona per me.

Al fine di verificare se 'Supporto IPv6' è abilitata nella versione di PHP/host:

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

Invece di usare PHP, ora puoi usare [INET6_ATON] di MySQL (http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_inet6-aton) per convertire la stringa nel suo valore numerico rappresentazione per MySQL> = 5.6. – Mike

2

Nota che MySQL (5.6) ora supportano indirizzi IPv6, vedere INET6_ATON().