Guide de géolocalisation IP en PHP
Obtenez le pays, la ville et les coordonnées approximatives d’une adresse IP en PHP.
Rechercher une adresse IP en PHP
La requête accepte une seule adresse IPv4 ou IPv6 et demande du JSON. Remplacez l’adresse de l’exemple par celle que vous souhaitez examiner.
<?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);
}Nécessite PHP avec l’extension cURL. Le délai de connexion est limité à trois secondes et la durée totale de la requête à huit secondes.
Lire les champs de localisation
location.country_code est le code pays à deux lettres ; location.country est le nom du pays. location.city peut être vide même si le pays est connu. Conservez une valeur vide comme inconnue.
location.latitude et location.longitude sont des coordonnées approximatives de la localisation du réseau. Vérifiez la présence d’un libellé de lieu exploitable avant de les afficher ; des coordonnées numériques seules ne permettent pas d’établir une localisation. Elles n’identifient ni un appareil ni une personne.
Pour obtenir l’adresse à l’origine de la requête, appelez https://api.ipquery.io/?format=json. Une requête envoyée par un serveur renvoie l’IP avec laquelle celui-ci se connecte ; une requête du navigateur renvoie l’adresse visible de sa connexion.
Précision et sécurité
La géolocalisation IP est une estimation de la localisation du réseau, pas de celle d’un appareil. Les VPN, proxies, réseaux mobiles et passerelles des opérateurs peuvent situer l’adresse loin de l’utilisateur. Traitez les valeurs manquantes comme inconnues plutôt que de les remplacer par une supposition.
Si votre application lit X-Forwarded-For, ne lui faites confiance que s’il est fourni par un proxy que vous contrôlez. Les en-têtes fournis par le client peuvent être falsifiés. Validez les adresses avant d’effectuer les recherches et traitez les délais d’attente et les erreurs HTTP séparément d’un résultat réussi.
Référence de l’API