Tutorials

IP's richtig in MYSQL Datenbank verwenden Tutorial

Einloggen
Benutzername:
Passwort:

Passwort vergessen?
Kostenlos
Anmelden
anzeigen
IP's richtig in MYSQL Datenbank verwenden


4274 - ntmb - 30.03.2008 16:55 Uhr - Version: 1 - - verlinken als BB-Code


Info: Dieses Tutorial komplett durchlessen, da auch weiter unten eine wichtige Update-Information ist.

Ip-Adressen werden oftmals bei einer Datenbank als Typ varchar(15) gespeichert, aber dies beansprucht bis zu 16 Bytes, was sich jetzt im Moment nicht viel anhört, aber dies ist schon beträchtig, wenn man dies auf viele Einträge sieht.

Eine IP-Adresse ist so aufgebaut:
0.0.0.0 - 255.255.255.255

Die maximale Länge einer IP beträgt 15 Zeichen.

Es gibt bestimmte Funktionen, um eine IP-Adresse in einen Integer-Wert umzuwandeln, die IP-Adresse ist dann eine ganze Zahl und kann dann so in die Datenbank hinterlegt werden.

Die jeweiligen Werte (255, 255,...) werden dann aneinander angeordnet im Dualsystem, also aus lauter 0 und 1.

Die Länge beträgt dann im Dualsystem immer 32 Zeichen. (101010110......)
Die jeweiligen Funktionen wandeln, dann die Zahl danach ins Dezimalsystem um.

Also so dies würde es im Hintergrund ablaufen:
255.255.255.255 -> 11111... (32 mal die Zahl 1) -> 4 294 967 295
IP-Adresse -> Dualsystem -> Dezimalzahl

Für diesen Wert eignet sich die der Spaltentyp INT mit der Attribute UNSIGNED, das UNSIGNED dient dazu das nur positive Werte eingetragen werden können, so ist Definitionsbereich nur im positiven Bereich und deshalb größer.

Ohne UNSIGNED währe der Definitionsbereich nur die Hälfte sozusagen, weil das negative mit einbezogen wird, so wäre der größte positive Wert dann maximal nur 2^31 - 1=2 147 483 647 groß und mit UNSIGNED: 2^31 - 1=4 294 967 295

Der Spaltentyp INT verbraucht nur 4 Bytes, was wesentlich weniger ist als varchar(15) mit seinen maximalen 16 Bytes.

Das gute an so einer Methode ist, dass wenn man, dann nach einer IP-Adresse sucht dies viel schneller funktioniert, da man nun nach einer Zahl sucht und nicht nach einem Text.


So dann wollen wir mal zum richtigen Teil übergehen, den Programmierteil:

Bevor ihr etwas an eurer Datenbank macht, erstellt unbedingt eine Datenbanksicherung, um Ärger zu vermeiden!

MYSQL und PHP bieten Funktionen an, um die IP-Adresse in eine Zahl umzuwandeln und wieder in eine IP-Adresse.

PHP liefert diese Befehle:
http://de.php.net/ip2long - IP zu Zahl umwandeln
http://de.php.net/long2ip - Zahl zu IP umwandeln

So sieht die Funktionsweise zum Beispiel aus:
1
2
3
<?
$ipadresse
=ip2long($_SERVER['REMOTE_ADDR']);
?>


In diesem Beispiel wird die aktuelle Ip-Adresse des Auszuführenden in eine Zahl umgewandelt und kann dann als solche im Laufe des Scripts verwendet werden.

So kann man dann anschließend die Variable $ipadresse als die IP verwenden und in die Datenbank eintragen, man muss bemerken, dass es sich um eine Zahl dann handelt und nicht um einem Text. -> ....VALUES('.$ipadresse.',...


Mysql bietet hierfür diese Befehle an:
INET_ATON('127.0.0.1' Smily NR:7
-> Wandelt IP-Adresse in eine Zahl um, dortiger Inhalt wird als Text gesehen und muss auch so behandelt werden!

INET_NTOA(2130706433)
-> Wandelt Zahl in eine Ip-Adresse um, der Inhalt dort drin wird als eine Zahl gesehen!


Wenn ihr in einer Datenbank die IP als Zahl vorliegen habt könnt ihr mit dem INET_NTOA Befehl ganz einfach diese Zahl in eine Ip-Adresse umwandeln, so könnte euere MYSQL-Abfrage beispielhaft aussehen:
1
2
3
<?
$query
=mysql_query('SELECT spalte1, spalte2, inet_ntoa(ip) as ip FROM tabelle');
?>


Bevor ihr etwas an eurer Datenbank macht, erstellt unbedingt eine Datenbanksicherung, um Ärger zu vermeiden!


Wenn ihr eure Datenbank umstellen wollt, hab ich das Richtige für euch.
Bei dieser Methode müsst ihr nur diese Befehle im phpmyadmin ausführen lassen, natürlich müsst ihr es noch anpassen. Smily NR:8
1
2
3
4
5
6
7
8
9
ALTER TABLE deinedatenbank ADD ip_neu INT(10) UNSIGNED NOT NULL AFTER spaltemitipadresse;

UPDATE deinedatenbank SET ip_neu=INET_ATON(spaltemitipadresse);

ALTER TABLE `deinedatenbank` CHANGE `spaltemitipadresse` `spaltemitipadresse` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'; 
 
UPDATE deinedatenbank SET spaltemitipadresse=ip_neu;

ALTER TABLE deinedatenbank DROP ip_neu;

Diese Befehle bewirken, dass eine neue Spalte nach spaltemitipadresse mit dem Namen ip_neu erstellt wird mit Typ int UNSIGNET. Anschließend wird die Ip umgewandelt und in die neue Spalte ip_neu hinterlegt als Zahl, danach wird die Spalte spaltemitipadresse zum Typ int UNSIGNED abgeändert. Der Inhalt von ip_neu wird in spaltemitipadresse übernommen. Zum Schluss wird die Spalte ip_neu wieder gelöscht.


Ich wünsche euch noch viel Spaß mit diesem Tutorial.

Update:
Ich habe jetzt etwas wichtiges herausgefunden und zwar, dass der php-Befehl anders funktioniert als gedacht. Der mysql Befehl funktioniert wie oben beschrieben, aber bei php geht es anders zu.

Und zwar wenn ihr mal dieses Script testweise mal ausführt, dann werdet ihr es verstehen.
1
2
3
4
5
6
7
8
<?
$ipadresse
=ip2long('127.255.255.255');
echo 
long2ip($ipadresse).'<br>';
$ipadresse=ip2long('128.0.0.0');
echo 
long2ip($ipadresse).'<br>';
$ipadresse=ip2long('255.255.255.255');
echo 
long2ip($ipadresse).'<br>';
?>

also die Zahlen Skala geht ungefähr so:
0.0.0.0 - 127.255.255.255 -> quasy die Hälfte -- 0 bis 2147483647
128.0.0.0 - 255.255.255.255 -> die ander Hälfte -- -2147483648 bis -1

Das hängt mit dem Vorzeichen zusammen, also wenn ihr lieber mit php die Konvertierung umsetzen wollt, was auch eigentlich mehr Sinn macht, dann müsst ihr nur das UNSIGNED nicht auswählen bei der Datenbank, also mit negativen Zeichen, so ist der Zahlenbereich dann von -2147483648 bis +2147483647.

Also vergisst nicht, dass man die beiden Varianten nur separat betreiben kann, also nur durch mysql oder php beides geht nicht!

mfg Eugen

Mitglieder-Kommentare


#2 von ntmb
Ich hab bei dem Tutorial ein wichtiges Update gemacht. Smily NR:4

mfg Eugen
Der freundliche Admin aus der Nachbarschaft
Lachecke.de - Dein täglicher Lacher im Internet
Listrank.de - Die ultimative Topliste nach Themen
#1 von B4ckflip
Also ich hab zwar kein Plan davon, ließt sich trotzdem interessant.
Hoffentlich wird es vielen leuten helfen Smily NR:2

Nur registrierte Mitglieder könnten einen Kommentar schreiben.

Melde dich doch ganz einfach an, es ist kostenlos. :-)