IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Herkunft einer IP-Adresse ermitteln



PHP: Herkunft einer IP-Adresse ermitteln

In diesem Artikel wird erklärt, wie man mit einem einfachen PHP-Skript und einer Datenbank das Land bestimmen kann, aus dem eine eingegebene IP-Adresse kommt.


Autor: Goe rgi (Goergi)
Datum: 26-05-2006, 23:14:08
Referenzen: Google, webhosting.info
Schwierigkeit: Anfänger
Ansichten: 43680x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Zu Beginn des Artikels wollen wir gleich klären, wozu man überhaupt diese Funktion braucht. Nun: die Gründe können verschieden sein; zum Beispiel lassen sich folgende Dinge später leicht realisieren: automatische Auswahl der Währung in internationalen Online-Shops, Besucherstatistiken, Spam Filter, Blockierung von Inhalten für bestimmte Herkunftsländer, ...

Das Wichtigste ist natürlich die IP-Adresse selbst. Diese Adressen wurden den verschiedenen Ländern in verschiedenen Intervallen zugeteilt. Somit gibt es für alle Länder (die Internet haben) einen oder mehrere Bereiche, in welchem diese Adressen vergeben können.
Trotzdem ist ein Fehler von 2% vorhanden. Das heißt 98 von 100 IP-Adressen werden korrekt zugeordnet.
Das Bestimmen des Landes erleichtert uns nun eine Liste, die von http://ip-to-country.webhosting.info bereitgestellt wird. Die Liste ist zip-komprimiert als CSV-Datei verfügbar. CSV ist die Abkürzung für „Comma Separated Values“, was so viel heißt, dass die einzelnen Werte einfach durch Beistriche von einander getrennt gespeichert sind.

Die aktuelle Liste ist unter http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip downloadbar.

Nach dem Download entpacken wir die Liste in irgendein Verzeichnis, von dem wir später dann auch Zugriff haben. Das Suchen von bestimmten Werten erledigen wir später mit einer kleinen mySQL-Tabelle. Doch dazu muss erst der Inhalt der CSV-Datei in eine Tabelle gespeichert werden.

Die neue Tabelle hat 5 Felder: Beginn des Bereichs, Ende des Bereichs, 2-stelliger Ländercode, 3-stelliger Ländercode und den ausgeschriebenen Namen des Landes.
CREATE TABLE `IPtoCountry` (
`IP_from` DOUBLE NOT NULL ,
`IP_to` DOUBLE NOT NULL ,
`zwei` CHAR( 2 ) NOT NULL ,
`drei` CHAR( 3 ) NOT NULL ,
`name` VARCHAR( 50 ) NOT NULL
);

Jetzt gibt es zwei Möglichkeiten die Daten in die Tabelle zu speichern: entweder ganz einfach mit phpMyAdmin importieren oder aber, die etwas kompliziertere Methode: dazu erstellen wir ein kleines Skript:

import.php
<?php
// CSV-Datei öffnen
$handle = fopen("ip-to-country.csv", "r");

// mySQL-Server verbinden
mysql_connect("localhost", "root", "password");
mysql_select_db("database");

// Schleife für jede Zeile der Datei durchlaufen
while ($zeile = fgetcsv($handle, 1024, ',', '"')) {
$sql = "INSERT INTO IPtoCountry VALUES('".$zeile[0]."', '".$zeile[1]."', '".$zeile[2]."', '".$zeile[3]."', '".$zeile[4]."');";
mysql_query($sql);
}

// CSV-Datei schließen
fclose($handle);
?>

HINWEIS: Der Pfad zur Datei und die mySQL-Verbindungsdaten müssen natürlich angepasst werden!

Im Skript wird die Datei geöffnet und mit der PHP-Funktion fgetcsv() wird uns jede Zeile der Datei als fertig ausgelesenes Array zurückgegeben.

Vielleicht ist manchen schon aufgefallen, dass die Felder der IP-Adressen nicht mit direkt ersichtlichen IP-Adressen befüllt sind. Das liegt daran, dass man schwer nach einer IP-Adresse suchen kann, die zum Beispiel kleiner als 82.223.54.154 ist. Wie macht man das nun? Eine IP-Adresse besteht aus 4 Bytes, die jeweils durch die Punkte getrennt sind. Behandelt man nun diese 4 Bytes als eine große Double-Zahl, so kommt man auf die Daten der Liste. Die Formel zur Berechnung der IP-Adresse A.B.C.D lautet:

Double = A*256*256*256+B*256*256+C*256+D

Auch daran wurde bei der Entwicklung von PHP gedacht und es gibt die Funktion IP2Long, die die Berechnung für uns übernehmen wird.

Jetzt kommt die Funtkion, die die Länder aus der Tabelle ausliest:

iptocountry.php
<?php
function IPtoCountry($IP) {
$IP = sprintf("%u",IP2Long($IP));
mysql_connect("localhost", "root", "");
mysql_select_db("database");
$result = mysql_query("SELECT name FROM iplist WHERE IP_from <= $IP AND IP_to >= $IP LIMIT 1");

if(
mysql_num_rows($result) == 0) {
$land = "Unbekannt";
} else {
$row = mysql_fetch_object($result);
$land = $row->name;
}

return
$land;
}
?>

Hier werden nur die ausgeschriebenen Namen der Länder ausgelesen. Möglich wären auch alle anderen Angaben.

Und so wird diese Funktion eingesetzt:

demo.php
<?php
include("iptocountry.php");
$IP = $_SERVER['REMOTE_ADDR'];
echo
"Ihre IP-Adresse kommt aus ".IPtoCountry($IP)."\n\n";

echo
"This script uses the IP-to-Country Database
provided by WebHosting.Info (http://www.webhosting.info),
available from http://ip-to-country.webhosting.info."
;
?>

Eine mögliche Erweiterung wäre: die Nationalflaggen unter dem 3-stelligen Code abspeichern und dann einen IMG-Tag einbinden:
// $drei = dreistelliger Ländercode
// $name = ausgeschriebener Name des Landes
echo '<img src="/flaggen/'.$drei.'.gif" alt="'.$name.'">';

Es lässt sich selbsverständlich noch viel Anderes damit machen; also frohes Schaffen!


magoo
Rookie
Beitrag vom:
16-10-2008, 10:45:16

Vielen Dank

Klasse Artikel! Zu diesem Thema musste ich so einige male Google anwerfen bis ich auf diesem Walk-Trough gelandet bin.

-----------------------------------------------------
Regards magoo


Goergi
Developer
Beitrag vom:
01-12-2006, 18:24:53

Hallo!
Danke, dass du mich auf den Fehler aufmerksam gemacht hast! Es fehlt das zweite '='-Zeichen.
Ist aber schon korrigiert ;-)
mfg
Goergi

-----------------------------------------------------


Beutelratte
Rookie
Beitrag vom:
01-12-2006, 17:46:49

Fehler

Hallo ich hab immer einen Fehler bei der IP Ermittlung:


Parse error: syntax error, unexpected '=' in /home/www/web31/html/ip/iptocountry.php on line 8



-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04506
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06241
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1140
Comments: 0