Localiser une IP en php
Résolu
Herve_be
Messages postés
1171
Statut
Membre
-
Herve_be Messages postés 1171 Statut Membre -
Herve_be Messages postés 1171 Statut Membre -
Bonjour,
Je trouve des réponses sur https://forums.commentcamarche.net/forum/ mais elles ne sont pas récentes; j'en ai essayé quelques unes : soit ça ne fonctionne pas du tout, soit le nombre d'interrogations est limité, ...
Bref, comment obtenir le pays et si possible la ville correspondants à une adresse IP ?
Merci
Je trouve des réponses sur https://forums.commentcamarche.net/forum/ mais elles ne sont pas récentes; j'en ai essayé quelques unes : soit ça ne fonctionne pas du tout, soit le nombre d'interrogations est limité, ...
Bref, comment obtenir le pays et si possible la ville correspondants à une adresse IP ?
Merci
A voir également:
- Localiser adresse ip php
- Ethernet n'a pas de configuration ip valide - Guide
- Comment connaître son adresse ip - Guide
- Darkino nouvelle adresse - Guide
- Adresse mac - Guide
- Adresse ip - Guide
32 réponses
Comme ceci ?
try $record = $reader->city(trim($IP)); catch (Exception $e) echo 'Exception reçue : '. $e->getMessage();
yg_be
Messages postés
24281
Statut
Contributeur
1 584
cela donne quoi comme résultat?
J'attendais une confirmation avant d'essayer
Mon code initial
Code modifié
Ça fonctionne !
Par exemple quand je vais chercher l'IP j'obtiens une erreur "80072F7D Une erreur s’est produite lors de la connexion sécurisée" que je mets dans la DB au lieu de l'IP.
Si j'essaye d'obtenir la localisation sur base de cette valeur qui n'est évidemment pas une IP, j'obtiens bien une exception qui est attrapée et qui ajoute "IP : " devant et le message d'erreur "attrapé" derrière, j'obtiens alors
IP : 80072F7D Une erreur s’est produite lors de la connexion sécurisée The value "80072F7D Une erreur s’est produite lors de la connexion sécurisée" is not a valid IP address.
A combiner autrement parce que a fait bizarre mais c'est correct.
J'arrangerai ça demain.
encore merci :-)
Mon code initial
if (filter_var($IP, FILTER_VALIDATE_IP) and $IP <> '0.0.0.0') { $record = $reader->city(trim($IP)); $IP = utf8_decode(($record->city->names['fr'] ?? "Ville?")."/".($record->country->names['fr'] ?? "Pays?")); }
Code modifié
Try {$record = $reader->city(trim($IP));} catch (Exception $e) {$IP = "IP : ".$IP." ". $e->getMessage();} if (substr($IP, 0, 5) !== "IP : ") $IP = utf8_decode(($record->city->names['fr'] ?? "Ville?")."/".($record->country->names['fr'] ?? "Pays?"));
Ça fonctionne !
Par exemple quand je vais chercher l'IP j'obtiens une erreur "80072F7D Une erreur s’est produite lors de la connexion sécurisée" que je mets dans la DB au lieu de l'IP.
Si j'essaye d'obtenir la localisation sur base de cette valeur qui n'est évidemment pas une IP, j'obtiens bien une exception qui est attrapée et qui ajoute "IP : " devant et le message d'erreur "attrapé" derrière, j'obtiens alors
IP : 80072F7D Une erreur s’est produite lors de la connexion sécurisée The value "80072F7D Une erreur s’est produite lors de la connexion sécurisée" is not a valid IP address.
A combiner autrement parce que a fait bizarre mais c'est correct.
J'arrangerai ça demain.
encore merci :-)
Bonjour,
Encore une question s'il te plait.
En cas d'erreur il exécute les instructions du bloc catch.
Est-il possible d'exécuter qqch s'il n'y a pas d'erreur ?
Dans le code ci-dessus, en cas d'erreur je mets "IP : ..." dans la variable $IP;
ensuite je teste la variable $IP, si elle ne contient pas "IP : " alors je peux décoder le résultat;
je trouve que ce n'est pas très propre comme code, une meilleure idée ?
Encore une question s'il te plait.
En cas d'erreur il exécute les instructions du bloc catch.
Est-il possible d'exécuter qqch s'il n'y a pas d'erreur ?
Dans le code ci-dessus, en cas d'erreur je mets "IP : ..." dans la variable $IP;
ensuite je teste la variable $IP, si elle ne contient pas "IP : " alors je peux décoder le résultat;
je trouve que ce n'est pas très propre comme code, une meilleure idée ?
n'est-il pas très simple de tester $record, pour déterminer si il y a eu erreur, ou pas?
en passant, je trouve dommage de réutiliser la variable $IP, au lieu d'utiliser une nouvelle variable.
exemple:
en passant, je trouve dommage de réutiliser la variable $IP, au lieu d'utiliser une nouvelle variable.
exemple:
Try { $record = $reader->city(trim($IP)); } catch (Exception $e) { $reponse = "IP : ".$IP." ". $e->getMessage(); } if ( empty($reponse) ) { $reponse = utf8_decode(($record->city->names['fr'] ?? "Ville?"). "/".($record->country->names['fr'] ?? "Pays?")); }
J'utilise la variable $IP plus loin quoi qu'elle contienne, c'est peut-être juste son nom qui est mal choisi.
Entretemps j'ai fait comme ceci
Que veux-tu dire par "tester $record" ?
Entretemps j'ai fait comme ceci
$CatchedError=false; Try {$record = $reader->city(trim($IP));} catch (Exception $e) {$CatchedError=true;} if ($CatchedError) { $IP = $e->getMessage(); } else { $IP = utf8_decode(($record->city->names['fr'] ?? "Ville?")."/".($record->country->names['fr'] ?? "Pays?")); }
Que veux-tu dire par "tester $record" ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bizarrement, avec $record->city->names['fr'] j'ai rarement la ville
avec $record->city->names['en'] pratiquement toujours.
avec $record->city->names['en'] pratiquement toujours.
Je ne parviens pas à obtenir la région
donne toujours "Region?"
Où est mon erreur ? Structure de la DB :
($record->city->names['en'] ?? "Ville?")."/".($record->subdivision->names['fr'] ?? "Region?")."/".($record->country->names['fr'] ?? "Pays?")
donne toujours "Region?"
Où est mon erreur ? Structure de la DB :
[1] => GeoIp2\Record\Subdivision Object ( [validAttributes:protected] => Array ( [0] => confidence [1] => geonameId [2] => isoCode [3] => names ) [locales:GeoIp2\Record\AbstractPlaceRecord:private] => Array ( [0] => en ) [record:GeoIp2\Record\AbstractRecord:private] => Array ( [geoname_id] => 2990129 [iso_code] => 59 [names] => Array ( [de] => Nord [en] => North [es] => Norte [fr] => Nord ) ) )
... avec
print_r($record)mais je n'ai pas mis la structure complète, seulement la partie où je trouve la région.
print_r($record->subdivision->names['fr']);donne Uncaught RuntimeException: Unknown attribute: subdivision
print_r($record->subdivision);donne Uncaught RuntimeException: Unknown attribute: subdivision
ça ne m'aide pas vraiment.
Si j'essaye de copier ici le print_r complet j'obtiens
You don't have permission to access "http://forums.commentcamarche.net/forum/_xhr_/postmsgfrm/" on this server.
Reference #18.8d01f351.1593356617.1f854d61
alors je l'ai sauvé là https://www.rudyv.be/Temp/Structure.txt
le pense que le message que tu as reçu devrait vraiment t'aider. "Unknown attribute: subdivision": qu'en penses-tu?
voici la partie utile de ton extrait. qu'y vois-tu?
voici la partie utile de ton extrait. qu'y vois-tu?
GeoIp2\Model\City Object ( [subdivisions:protected] => Array ( [0] => GeoIp2\Record\Subdivision Object ( [record:GeoIp2\Record\AbstractRecord:private] => Array ( [names] => Array ( [en] => Hauts-de-France [fr] => Hauts-de-France ) ) ) [1] => GeoIp2\Record\Subdivision Object ( [record:GeoIp2\Record\AbstractRecord:private] => Array ( [names] => Array ( [de] => Nord [en] => North [es] => Norte [fr] => Nord ) ) )
Si tu fais allusion à "protected" pourquoi ai-je bien accès à city ?
GeoIp2\Model\City Object ( [city:protected] => GeoIp2\Record\City Object ( [validAttributes:protected] => Array ( [0] => confidence [1] => geonameId [2] => names ) [locales:GeoIp2\Record\AbstractPlaceRecord:private] => Array ( [0] => en ) [record:GeoIp2\Record\AbstractRecord:private] => Array ( [geoname_id] => 3013619 [names] => Array ( [en] => Hazebrouck [fr] => Hazebrouck [ja] => アーズブルック [ru] => Ðзбрук [zh-CN] => 阿兹布é²å…‹ ) ) )
Si je te suis il faut utiliser
[subdivisions:protected] => Array
(avec s) qui contient 2 niveaux
[0] => GeoIp2\Record\Subdivision Object
[1] => GeoIp2\Record\Subdivision Object
le second [1] contient le nom que je cherche, cependant je ne connais pas l'utilisation de ces arrays complexes, comment aller chercher names['fr'] ?
[subdivisions:protected] => Array
(avec s) qui contient 2 niveaux
[0] => GeoIp2\Record\Subdivision Object
[1] => GeoIp2\Record\Subdivision Object
le second [1] contient le nom que je cherche, cependant je ne connais pas l'utilisation de ces arrays complexes, comment aller chercher names['fr'] ?
[1] => GeoIp2\Record\Subdivision Object ( [validAttributes:protected] => Array ( [0] => confidence [1] => geonameId [2] => isoCode [3] => names ) [locales:GeoIp2\Record\AbstractPlaceRecord:private] => Array ( [0] => en ) [record:GeoIp2\Record\AbstractRecord:private] => Array ( [geoname_id] => 2990129 [iso_code] => 59 [names] => Array ( [de] => Nord [en] => North [es] => Norte [fr] => Nord ) ) )
ne serait-ce pas beaucoup plus clair si tu montrais quelle instruction tu utilises pour obtenir ce que tu partages? en plus, tu supprimes chaque fois, avant de partager, la partie utile.
essaie peut-être
il ne s'agit pas d'array complexes. as-tu déjà utilisé des array en php?
peux-être pourrais-tu commencer par des exercices plus simples en php?
essaie peut-être
print_r($record->subdivisions[1]);
il ne s'agit pas d'array complexes. as-tu déjà utilisé des array en php?
peux-être pourrais-tu commencer par des exercices plus simples en php?
Bonjour,
Pour obtenir ce que je montre j'utilise
Je ne parviens pas à coller le résultat complet sur ce forum, alors j'ai mis la totalité du résultat de print_r dans ce fichier https://www.rudyv.be/Temp/Structure.txt
j'ai donc compris que je dois utiliser
Merci beaucoup
Pour obtenir ce que je montre j'utilise
print_r($record);
Je ne parviens pas à coller le résultat complet sur ce forum, alors j'ai mis la totalité du résultat de print_r dans ce fichier https://www.rudyv.be/Temp/Structure.txt
print_r($record->subdivisions[1]);donne le résultat ci-dessous
j'ai donc compris que je dois utiliser
$record->subdivisions[1]->names['fr']: ça fonctionne !
Merci beaucoup
GeoIp2\Record\Subdivision Object ( [validAttributes:protected] => Array ( [0] => confidence [1] => geonameId [2] => isoCode [3] => names ) [locales:GeoIp2\Record\AbstractPlaceRecord:private] => Array ( [0] => en ) [record:GeoIp2\Record\AbstractRecord:private] => Array ( [geoname_id] => 2796741 [iso_code] => WHT [names] => Array ( [de] => Provinz Hennegau [en] => Hainaut Province [fr] => Hainaut [pt-BR] => Hainaut ) ) )