Dat is redelijk simpel naar mijn mening. Je maakt een kolom in je database met een varbinary( 16 ) aan. Deze kolom zal uiteindelijk je IP bevatten.
Daarnaast moet IPv6 wel enabled staan in PHP. Bij zowel IPv4 en IPv6 haal je er een inet_ntop en inet_pton (PHP >= 5.1.0) overheen.
Dus het zal dan als volgt zijn:
$_IPton = inet_pton($_SERVER['REMOTE_ADDR']); //Kan ook $_SERVER['HTTP_X_FORWARDED_FOR'] en $_SERVER['CLIENT_IP'] zijn dus gewoon een functie daarvoor maken.
$_IP = inet_ntop($_IPton);
Waarom doe je eerst inet_pton en daarna inet_ntop?
Zo maak je de variabel een consistente string. Je kunt er namelijk niet vanuit gaan dat deze altijd consistent is.
PHP Manual (inet_ntop):
This function converts a 32bit IPv4, or 128bit IPv6 address (if PHP was built with IPv6 support enabled) into an address family appropriate string representation.
PHP Manual (inet_pton):
This function converts a human readable IPv4 or IPv6 address (if PHP was built with IPv6 support enabled) into an address family appropriate 32bit or 128bit binary structure.
Als de hierboven code een error voor je oplevert probeer dan het volgende:
Maak twee kolommen aan:
- ipv4 (INT UNSIGNED)
- ipv6 (BINARY 16)
Dan wanneer je een insert doet met een IPv4 adres kun je als value het volgende doen:
INET_ATON($_IP)
Als je dan weer het IP uit de database wilt halen kun je dat in de select query doen door om de kolom INET_NTOA te zetten.
Bij een IPv6 doe je het volgende in een insert query:
mysql_real_escape_string(inet_pton($_IP))
En om het weer uit de database te halen doe je gewoon een normale select query en in een variabel doe je inet_pton.
E.g. $ipv6 = inet_ntop($select['ipv6']);
Wat nou als ik ze gecombineerd wil hebben?
Dan kun je een functie schrijven die checkt of het IP een IPv4 of een IPv6 type is. Dan kun je het bovenstaande gewoon hergebruiken alleen moet je voor de kolom waar het IP inkomt een geschikte kolomtype selecteren die beiden goed ondersteunen.