<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Funzis chaotische Welt &#187; PHP</title>
	<atom:link href="http://www.funzi.org/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.funzi.org</link>
	<description>yet another outdated weblog</description>
	<lastBuildDate>Tue, 02 Mar 2010 11:42:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PHP: Land zu IP-Adresse ermitteln</title>
		<link>http://www.funzi.org/2008/04/14/land-zu-ip-adresse-ermitteln/</link>
		<comments>http://www.funzi.org/2008/04/14/land-zu-ip-adresse-ermitteln/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 22:01:41 +0000</pubDate>
		<dc:creator>Funzi</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.funzi.org/?p=8</guid>
		<description><![CDATA[In diesem Artikel zeige ich, wie man effizient das zugehörige Land einer IP-Adresse ermitteln kann.
Als erstes brauche ich eine kostenlose Datenbasis. Nach einiger Zeit des Suchens halte ich IP-to-Country.com für die beste Quelle. Ich lade mir die IP-to-Country Database herunter und entpacke sie.
Da ich nicht jedes mal die gesamte CSV-Datei durchsuchen möchte, erstelle ich eine [...]]]></description>
			<content:encoded><![CDATA[<p>In diesem Artikel zeige ich, wie man effizient das zugehörige Land einer IP-Adresse ermitteln kann.<span id="more-8"></span></p>
<p>Als erstes brauche ich eine kostenlose Datenbasis. Nach einiger Zeit des Suchens halte ich <a href="http://ip-to-country.webhosting.info/">IP-to-Country.com</a> für die beste Quelle. Ich lade mir die <i>IP-to-Country Database</i> herunter und entpacke sie.<br />
Da ich nicht jedes mal die gesamte CSV-Datei durchsuchen möchte, erstelle ich eine MySQL-Tabelle <i>ip_locations</i>:</p>
<pre><code>CREATE TABLE `ip_locations` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `from` int(10) unsigned NOT NULL,
  `to` int(10) unsigned NOT NULL,
  `country` char(2) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `from` (`from`,`to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;</code></pre>
<p>Die Felder <i>from</i> und <i>to</i> beinhalten die IP-Adresse als long integer (also kein dotted quad) und werden gemeinsam indiziert. Im Feld <i>country</i> wird der Ländercode im ISO3166-Format gespeichert.<br />
Mit einer kleinen PHP-Funktion lese ich die CSV-Datei in die Datenbank ein:</p>
<pre><code>function ip2country_csv($filename)
{
  $array = file($filename);
  foreach ($array as $row)
  {
    if (preg_match('/^"([0-9]{1,10})","([0-9]{1,10})",'
                 . '"([A-Z]{2})".+$/', $row, $tmp))
    {
      mysql_query("INSERT INTO
                     `ip_locations`
                   SET
                     `from` = '{$tmp[1]}',
                     `to` = '{$tmp[2]}',
                     `country` = '{$tmp[3]}'");
    }
  }
}</code></pre>
<p>Jetzt kann ich mit einer einfachen MySQL-Anfrage das Land ermitteln:</p>
<pre><code>SELECT
  `country`
FROM
  `ip_locations`
WHERE
  &lt;IP&gt; BETWEEN `from` AND `to`;</code></pre>
<p>Natürlich muss man <i>&lt;IP&gt;</i> vorher durch die gesuchte IP-Adresse ersetzen. Diese kann man mit der PHP-Funktion ip2long() leicht von dottet quad in long integer umwandeln.</p>
<p>Angenommen ich hätte eine Session-Tabelle, die die IP-Adresse als long integer beinhaltet. Dann könnte ich wie folgt effizient das Land ermitteln:</p>
<pre><code>SELECT
  `sessions`.*
FROM
  `sessions` LEFT OUTER JOIN `ip_locations` ON  `sessions`.`ip`
     BETWEEN `ip_locations`.`from` AND `ip_locations`.`to`;</code></pre>
<p>Das sollte für&#8217;s Erste reichen. Man kann diese Angaben dann mit einer Flaggen-Bild-Bibliothek noch schön erweitern, so dass man in einer Tabelle die Landesflagge ausgeben kann.</p>
<p><strong>PS:</strong> Mir geht an WordPress ziemlich auf die Nerven, dass es meine Leerzeichen in den Code-Abschnitten beim Speichern verschluckt. Wenn jemand ein praktisches Plugin kennt, was mir bei dieser Sache hilft, wäre ich sehr froh.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.funzi.org/2008/04/14/land-zu-ip-adresse-ermitteln/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
