Handleiding voor IP-geolocatie met PHP
Haal met PHP het land, de plaats en de geschatte coördinaten van één IP-adres op.
Een IP-adres opzoeken met PHP
Het verzoek accepteert één IPv4- of IPv6-adres en vraagt om JSON. Vervang het voorbeeldadres door het adres dat je wilt onderzoeken.
<?php
$ip = '8.8.8.8'; // Replace with a validated IPv4 or IPv6 address.
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
throw new InvalidArgumentException('Invalid IP address');
}
$url = 'https://api.ipquery.io/' . rawurlencode($ip) . '?format=json';
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 8,
]);
$body = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if ($body === false) {
$error = curl_error($handle);
throw new RuntimeException('IP lookup failed: ' . $error);
}
if ($status !== 200) {
throw new RuntimeException('IPQuery returned HTTP ' . $status);
}
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if (($data['ip'] ?? null) !== $ip || !isset($data['location']) || !is_array($data['location'])) {
throw new RuntimeException('Unexpected IPQuery response');
}
$location = $data['location'];
$countryCode = strtoupper(trim((string) ($location['country_code'] ?? '')));
$city = trim((string) ($location['city'] ?? ''));
echo 'Country code: ' . ($countryCode ?: 'Unknown') . PHP_EOL;
echo 'City: ' . ($city ?: 'Unknown') . PHP_EOL;
// Coordinates describe an approximate network location, not the user.
$latitude = $location['latitude'] ?? null;
$longitude = $location['longitude'] ?? null;
if (preg_match('/^[A-Z]{2}$/', $countryCode) &&
!in_array($countryCode, ['XX', 'ZZ'], true) &&
is_numeric($latitude) && is_numeric($longitude)) {
printf('Approximate coordinates: %.5f, %.5f%s', $latitude, $longitude, PHP_EOL);
}Vereist PHP met de cURL-extensie. De verbindingstime-out is drie seconden en de totale tijdslimiet voor het verzoek is acht seconden.
De locatievelden lezen
location.country_code is de tweeletterige landcode; location.country is de landnaam. location.city kan leeg zijn, ook als het land bekend is. Behandel een lege waarde als onbekend.
location.latitude en location.longitude zijn geschatte coördinaten van de netwerklocatie. Controleer vóór weergave of er een bruikbare plaatsaanduiding is; alleen numerieke coördinaten stellen geen locatie vast. Ze identificeren geen apparaat of persoon.
Roep voor het adres van de aanvragende verbinding het volgende endpoint aan: https://api.ipquery.io/?format=json. Een serververzoek retourneert het IP-adres waarmee de server verbinding maakt; een browserverzoek retourneert het zichtbare adres van die verbinding.
Nauwkeurigheid en beveiliging
IP-geolocatie is een schatting van de netwerklocatie, geen apparaatlocatie. VPN’s, proxy’s, mobiele netwerken en gateways van providers kunnen ertoe leiden dat het adres ver van de gebruiker wordt geplaatst. Behandel ontbrekende waarden als onbekend in plaats van ze met een aanname in te vullen.
Als je toepassing X-Forwarded-For leest, vertrouw die header dan alleen als deze afkomstig is van een proxy die je beheert. Door de client aangeleverde headers kunnen worden vervalst. Valideer adressen vóór het opzoeken en behandel time-outs en HTTP-fouten afzonderlijk van een geslaagd resultaat.
API-referentie