|
|
|
Herkunft einer IP-Adresse ermitteln. (IP to Country)
Zurück zur Übersicht Zu beginn dieses Codeschnipsel wollen wir erstmal klären, wofür man diese Funktion gebrauchen kann. Beispiel dafür wären Spam-Filter, internationale Online-Shops, Besucherstatistiken oder z.B. Blockierung von Inhalten für bestimmte Herkuntsländer.
Das wichtgste dabei ist 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.
| Zitat: |
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 |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
|
<?php
// CSV-Datei öffnen
$handle = fopen("ip-to-country.csv", "r");
// mySQL-Server verbinden
mysql_connect("localhost", "root", "");
mysql_select_db("databse");
// 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 |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
|
<?php
function IPtoCountry($IP) {
$IP = sprintf("%u",IP2Long($IP));
mysql_connect("localhost", "root", "");
mysql_select_db("database");
$result = mysql_query("SELECT name FROM IPtoCountry WHERE IP_from <= $IP AND IP_to >= $IP LIMIT 1")or die("".mysql_error()."");
if(mysql_num_rows($result) == 0) {
$land = "Unbekannt";
} else {
$row = mysql_fetch_object($result)or die("".mysql_error()."");
$land = $row->name; echo "Ihre IP-Adresse kommt aus ".$land." !<br><br>";
$fullhost = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
echo "Ihr Provider kommt von http://".$fullhost;
} }
?>
|
|
Hier werden nur die ausgeschriebenen Namen der Länder ausgelesen. Möglich wären auch alle anderen Angaben.
Und so wird diese Funktion eingesetzt:
index.php
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
<?php
include("iptocountry.php");
$IP = $_SERVER['REMOTE_ADDR'];
echo "".IPtoCountry($IP)."";
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:
| PHP |
1:
2:
3:
4:
5:
|
<?php
// $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!
Ursprüngliche Quelle:
http://www.it-academy.cc/article/1467/PHP:+Herkunft+einer+IPAdresse+ermitteln.html
Code editiert by Wortora
Kommentare
Zurück zur Übersicht
Autor Wortora
|
|
|
|