IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Foreach sur un curl avec des données CONCAT


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2022
    Messages : 31
    Par défaut Foreach sur un curl avec des données CONCAT
    Hello tout le monde !

    J'essaye de récupérer dans une table l'adresse, la ville et le CP de plusieurs client pour ensuite récupérer la latitude et la longitude de ces adresses.

    Quand je fais ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    $reponse = $bdd->query('SELECT address, city, postal_code FROM address');
     
    while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
    {
        echo '<tr>';
     
        foreach ($donnees as $field) {
            $curl= curl_init('https://nominatim.openstreetmap.org/search?q='.$field.'&format=jsonv2');
     
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
     
            curl_setopt($curl, CURLOPT_CAINFO, 'D:\wamp\www\\cacert.pem');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Accept: application/json'
            ));
            $data = curl_exec($curl);
     
            if($data === false){
            var_dump(curl_error($curl));
            }
            else {
                $data = json_decode($data, true);
                echo '<pre>';
                var_dump($data);
     
                }
                echo '</tr>';
            }  
     
    }
    Je récupère les données mais ça me retourne tous les résultats possibles pour chaque code postal en premier alors que je n'ai besoin que d'un seul résultat par ligne de ma BDD et pas 50.

    Je veux que les trois valeurs de base soient ensemble dans l'URL car sinon les données ne sont pas bonnes.

    Toutes les adresses de ma BDD sont en France mais je me retrouve avec des résultats hors FR du coup. Dans l'exemple ci-dessous, ça prend le premier code postal de ma BDD "13600" et ça me retourne tous les résultats possible, alors que je ne veux que la FR :

    Nom : curl KO avec valeurs.png
Affichages : 267
Taille : 104,8 Ko

    Du coup j'ai voulu utiliser CONCAT pour rassembler les trois colonnes de ma table dans une seule chaine de caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    $reponse = $bdd->query('SELECT CONCAT(address, city, postal_code) FROM address');
     
    while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
    {
        echo '<tr>';
     
        foreach ($donnees as $field) {
            $curl= curl_init('https://nominatim.openstreetmap.org/search?q='.$field.'&format=jsonv2');
     
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
     
            curl_setopt($curl, CURLOPT_CAINFO, 'D:\wamp\www\\cacert.pem');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Accept: application/json'
            ));
            $data = curl_exec($curl);
     
            if($data === false){
            var_dump(curl_error($curl));
            }
            else {
                $data = json_decode($data, true);
                echo '<pre>';
                var_dump($data);
     
                }
                echo '</tr>';
            }  
     
    }
    Sauf que dès que j'utilise le CONCAT, je n'ai plus de résultats, je n'ai que des NULL. J'ai testé avec le CONCAT_WS et même en utilisant COALESCE() mais rien n'y fait...

    Nom : curl ko concat.png
Affichages : 228
Taille : 51,5 Ko

    Y'a t'il un autre moyen d'arriver au résultat voulu sans forcément utiliser un CONCAT pour le coup ?


    Par ailleurs il y a un problème quand j'essaye de récupérer la latitude et longitude sans utiliser le CONCAT.

    Nom : error php.png
Affichages : 230
Taille : 65,8 Ko

    Pourtant quand j'ai testé mon code en dehors de la boucle l'appel fonctionnait correctement.

    Voici le code dans la boucle sans le CONCAT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    $reponse = $bdd->query('SELECT address, city, postal_code FROM address');
     
    while ($donnees = $reponse->fetch())
    {
        echo '<tr>';
     
        foreach ($donnees as $field) {
            $curl= curl_init('https://nominatim.openstreetmap.org/search?q='.$field.'&format=jsonv2');
     
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
     
            curl_setopt($curl, CURLOPT_CAINFO, 'D:\wamp\www\\cacert.pem');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Accept: application/json'
            ));
            $data = curl_exec($curl);
     
            if($data === false){
            var_dump(curl_error($curl));
            }
            else {
                $data = json_decode($data, true);
                echo '<pre>';
                var_dump($data);
                $lat = $data[0]['lat'];
                echo $lat;
                }
                echo '</tr>';
            }  
     
    }
    La latitude est pourtant bien présente dans $data[0]['lat'] je ne comprends pas trop.

  2. #2
    Membre chevronné Avatar de licardentaistor
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2021
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2021
    Messages : 345
    Par défaut
    pourquoi ne pas utiliser la recherche structurée, et forcer le country à France

    https://nominatim.openstreetmap.org/...country=France

  3. #3
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2022
    Messages : 31
    Par défaut
    Citation Envoyé par licardentaistor Voir le message
    pourquoi ne pas utiliser la recherche structurée, et forcer le country à France

    https://nominatim.openstreetmap.org/...country=France
    Hello,

    J'ai tenté la recherche structuré en utilisant :

    $curl= curl_init('https://nominatim.openstreetmap.org/search?q='.$field.'&country=France&format=jsonv2')

    Mais cela ne fonctionne pas j'ai toujours le même résultat.

    Si je ne souhaite pas utiliser le paramètre "q" mais les autres "street" "city" ... Comment est ce que je peux faire pour récupérer ceux de chaque client vu qu'ils ne sont pas dans la même colonne ?

    Le CONCAT ne fonctionne pas

  4. #4
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 668
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 668
    Par défaut
    après avoir fait $donnees = $reponse->fetch(), vous pouvez récupérer chaque valeur séparément en faisant $donnees["city"].

    vous pouvez voir d'autres exemples d'utilisation dans la documentation officielle :
    https://www.php.net/manual/fr/language.types.array.php

  5. #5
    Membre averti
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Octobre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2022
    Messages : 31
    Par défaut
    Citation Envoyé par mathieu Voir le message
    après avoir fait $donnees = $reponse->fetch(), vous pouvez récupérer chaque valeur séparément en faisant $donnees["city"].

    vous pouvez voir d'autres exemples d'utilisation dans la documentation officielle :
    https://www.php.net/manual/fr/language.types.array.php

    Mais si j'utilise cette méthode où dois je récupérer les valeurs ? Dans le while ? Le Foreach ?

    Car je dois ensuite pouvoir concaténer l'adresse, la ville et le CP sur une seule chaine de caractère afin de pouvoir la mettre dans le paramètre de l'URL et récupérer les données.

    J'ai juste testé avec l'adresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    while ($donnees = $reponse->fetch(PDO::FETCH_ASSOC))
    {
        echo '<tr>';
     
        $donnees2 = $donnees['address'];
     
        foreach ($donnees2 as $field) {
            $curl= curl_init('https://nominatim.openstreetmap.org/search?q='.$field.'&format=jsonv2');
     
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13');
     
            curl_setopt($curl, CURLOPT_CAINFO, 'D:\wamp\www\\cacert.pem');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
     
            curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json',
                'Accept: application/json'
            ));
            $data = curl_exec($curl); 
     
            if($data === false){
            var_dump(curl_error($curl));
            }
            else {
                $data = json_decode($data, true);
                echo '<pre>';
                var_dump($data);
     
                }
            curl_close($curl); 
        }
    et j''ai un message d'erreur :

    Warning: Invalid argument supplied for foreach()

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 668
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 668
    Par défaut
    affichez ce que vous avez dans $donnees2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 01/10/2014, 15h32
  2. Index sur une table avec des données temporaires
    Par mioux dans le forum Développement
    Réponses: 5
    Dernier message: 12/01/2012, 17h05
  3. Réponses: 3
    Dernier message: 09/11/2010, 00h45
  4. [cURL] Envoyer des données avec la methode GET
    Par hicham285 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 21/11/2007, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo