PHP-Einfach.de PHP lernen leicht gemacht

Navigation
» Startseite
» Newsübersicht
» Kontakt
» Impressum

Community
» Forum
» Gästebuch

Tutorial
» PHP Tutorial
» MySQL Tutorial
» PHP
» MySQL
» Codeschnipsel

Downloads
» Einführung
» Scripts
» Command Board

Sonstiges
» md5-Generator
» Generator
» Wissenswertes

PHP lernen


Dieses Projekt wird unterstützt von
Lichteffekte Shop

 
Partner:
PHP Forum
Mathe Nachhilfe
Suchmaschinenoptimierung

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($handle1024',''"')) { 
$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

News
13.08 - » Spam im Gästebuch
Endlich Schluss mit dem Spam

08.12 - » Clanletter 2.0
Clanletter wurde komplett neu programmiert

01.09 - » Command Board 1.0 - 2.0
Das Command Board 1.0 Beta 2.0 ist erschienen


Mehr

Forum
» Entwickler Forum

» insert nach login

» Tabellenzelle zu groß







© PHP-Einfach.de 2003 - 2012