2012-05-14 13 views
6

Ok, jetzt bin ich mir bewusst, dass ähnliche Fragen wahrscheinlich eine Million Mal gestellt wurden, aber ich bin ein echter Neuling in diesem und ich würde Ihre Hilfe hier wirklich schätzen.Speichern der IP-Adresse in MySQL-Datenbank (IPv4 UND IPv6)

Grundsätzlich möchte ich die Besucher-IP-Adresse in einem MySQL für späteren Abruf und Überprüfung speichern. Ich muss zuerst wissen, in welcher Art von Feld ich die IP-Adresse speichern muss. Außerdem möchte ich das System möglichst mit IPv6-Adressen kompatibel machen.

Vielen Dank im Voraus

+1

Was sind Ihre wichtigsten Anwendungsfälle für die Adressen? Wirst du sie abfragen? Teilen Sie sie auf und fragen Sie nach einigen Subnetting-Regeln? Oder sind sie nur zur Anzeige gespeichert? –

+2

Versuchen Sie Folgendes: http://StackOverflow.com/Questions/2049681/Store-ipv6-in-Database – Mark

+0

Nun, es ist für einen Bestätigungslink. Ich möchte sicherstellen, dass der Bestätigungslink von derselben IP-Adresse aus aufgerufen wurde, auf der er generiert wurde. Also werde ich sie abfragen] – Andy

Antwort

9

eine IPv4 speichern Sie eine INT UNSIGNED verwenden können

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

und rufen Sie sie mit der Funktion zurück INET_NTOA:

, während für eine IPv6 Sie eine decimal(39,0), benötigen eine IP in der Tabelle speichern können Sie die Funktion INET_ATON verwenden
SELECT INET_NTOA(ipcol) AS ip FROM table; 

Diese Antwort existierte vor MySQL IPv6-Unterstützung; Benutzer sollten darauf hingewiesen werden, dass MySQL jetzt nativ IPv6 unterstützt:https://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html

+0

Danke, aber ich dachte, ich habe gerade gelesen, dass 'INET_ATON()' IPv6 nicht unterstützt. Und selbst wenn, wie bekomme ich die IPv6-Adresse mit PHP? – Andy

+0

Versuchen Sie mit inet_pton: http://php.net/manual/en/function.inet-pton.php – aleroot

+0

Fair genug, danke. Wie kann ich die IP-Adresse des Benutzers in PHP finden? – Andy

1

Es gibt keinen Integraltyp in MySQL groß genug, um eine IPv6-Adresse zu speichern. Die kompakteste Art, es zu speichern, ist so etwas wie BINARY(16). Wenn Sie nur Adressen speichern und abrufen müssen und keine logischen Operationen für sie ausführen müssen (z. B. Netzmaskenoperationen, um nach den IP-Adressen zu suchen, die unter ein Deckungsvorwort fallen), reicht das. Wenn Sie logische oder Bit-Operationen durchführen müssen, müssen Sie raffinierter sein: Sie müssen IPv6-Adressen in zwei separaten 64-Bit-Integer-Spalten speichern.

+0

Nein, ich muss nichts weiter machen (nur Abfragen/Vergleichen in einer Abfrage). Alles, was ich jetzt wissen muss, ist, wie ich die IP-Adresse des Benutzers mit PHP erhalten kann? – Andy

4

Ich benutze VARBINARY (16) für den Datentyp und verwenden Sie die Funktion MySQL INET_ATON() die IP-Nummer einzufügen (die ich später mit der Reverse-Funktion lesen, INET_NTOA().

+0

Wird also VARBINARY (16) sowohl IPv4 als auch IPv6 unterstützen? Und wie finde ich die IP-Adresse der Besucher mit PHP? – Andy

+1

Sie müssen INET6_NTOA und INTE6_ATON verwenden, aber das ist nicht in MySQL bis Version 5.6.3 verfügbar. –

Verwandte Themen