Vilket land kommer besökaren i från?

Vi satt på kontoret häromdagen och diskuterade det här med sidor på olika språk, hur man enklast ser till så att besökaren hamnar på rätt sida. Därför har jag skrivit ihop ett enkelt exempel som kontrollerar besökarens IP-adress och gör att uppslag mot en IP-databas.  För att slå upp ip-adressen har jag använt databasen från Per Gustaffson och sidan ip2nation.com. Databasen innehåller två tabeller, ip2nationCountries och ip2nation.

Tillvägagångsätt

Tillvägagångssättet ser ut som följer. I steg ett tar vi reda på besökarens ip-adress. Vi kontrollerar vilket land besökaren kommer ifrån för att sedan skicka vidare till korrekt sida.

Flöde

Skapa PHP-scriptet

Vi kommer börja med att skapa en klass som heter IpToNation. Den innehåller databasinställningar samt en funktion för att hämta vilket land besökaren kommer ifrån.

Det är inte optimalt att blanda denna typ av funktionalitet, utan det hade varit bättre att ha en ren databasklass samt en IpToNation klass. Men eftersom detta är ett exempel lägger jag dessa i en och samma klass.

Vi börjar med att skapa filen ‘IpToNation.php‘.

class IpToNation
{
	protected $dbHost = "localhost";
	protected $dbUser = "dbuser";
	protected $dbPassword = "dbpassword";
	protected $dbTable = "ip2nation";
	private $mysqli;

	public function Connect() {
		//Skapa nytt mysqli-objekt
		$this->mysqli = new mysqli($this->dbHost, $this->dbUser, $this->dbPassword, $this->dbTable);
	}
	public function Disconnect() {
		$this->mysqli->close();
	}

	public function GetCountryFromIp($ipAddress)
	{
		//INET_ATON omvandlar en ipadress till numeriskt värde
		$sqlQuery = 'SELECT ip.country, ipc.country
					FROM ip2nation AS ip
					INNER JOIN ip2nationCountries as ipc ON ipc.code = ip.country
					WHERE ip.ip < INET_ATON(?)
					ORDER BY ip DESC LIMIT 0,1';

		$this->Connect();
		if($stmt = $this->mysqli->prepare($sqlQuery)) {
			$stmt->bind_param("s", $ipAddress);
			$stmt->execute();
			$stmt->bind_result($countryCode, $countryName);
			$stmt->fetch();
			$this->Disconnect();

			$resultArray = array('countryCode' => $countryCode, 'countryName' => $countryName);
			return $resultArray;
		}
	}
}

De första två funktionerna använder vi för att öppna och stänga anslutningen till databasen.

Den tredje funktionen GetCountryFromIP tar ett ip-nummer som inparameter. Utifrån detta ip-nummer kan vi sedan slå upp vilket land användaren kommer ifrån. Eftersom ip-adresserna är sparade som numeriska värden måste vi använda funktionen INET_ATON för att omvandla vår ip-adress. Du kan läsa mer om INET_ATON på MySQLs officiella sida. Funktionen avslutar med att returnera en array innehållandes landskod och namn.

Nästa steg är att skapa index.php. Det är denna sida som används för att kontrollera ip-nummer och skicka vidare besökaren.

include 'IpToNation.php';

$clientIp = $_SERVER['REMOTE_ADDR'];

$ipToNationObject = new IpToNation();
$currentCountry = $ipToNationObject->GetCountryFromIp($clientIp);

echo "

Vilket land kommer IP-numret ifrån?

"; switch ($currentCountry['countryCode']) { case 'se': echo "Du verkar komma från " . $currentCountry['countryName'] . ", skicka vidare till Svenska sidan"; break; case 'no': echo "Du verkar komma från " . $currentCountry['countryName'] . ", skicka vidare till Norska sidan"; break; default: echo "Du verkar komma från " . $currentCountry['countryName'] . ", skicka vidare till Internationella sidan"; break; }

Det första vi gör i denna fil är att ta reda på besökarens ip-adress genom $_SERVER['REMOTE_ADDR'] Vi skickar sedan ipadressen till vår funktion GetCountryFromIP och får tillbaka namnet på landet samt landskoden.
Efter det använder vi en switch-sats för att bestämma vad som ska hända, i detta exempel gör vi ingenting utan skrivet endast ut vilket land användaren kommer ifrån. Man kan tänka sig att skicka besökaren vidare eller sätta en cookie.

Som sagt innan kan du ladda ner databasen från ip2nation.

Demo och ladda ner

Se demo eller Ladda ner källkoden här.

5 Replies to “Vilket land kommer besökaren i från?”

Din kommentar eller åsikt