Requête Ajax et double objet JSON

Résolu

Bonjour à tous,

Vous m'avez aidé ici à construire ma requête Ajax qui fonctionne parfaitement et me retourne comme il faut mon objet Json ($client).
J'ai besoin maintenant que la page de traitement, dans le même temps, en profite pour récupérer les contrats du client en question. J'ai donc mis, à la suite du code, un copier/collé d'une requête qui fonctionne sans erreur dans PhpMyadmin mais qui dans mon application m'ouvre ma boite d'alerte "Erreur Ajax" !
Dans la console il y a ça :

responseText:"{\"id\":\"74\",\"type\":\"0\",\"nom\":\"ARNAUD Alain\",\"civilite\":\"M.\",\"contact\":\"\",\"adresse\":\"145 rue des Platanes\",\"cp\":\"75001\",\"ville\":\"PARIS\",\"pays\":\"France\",\"telephone\":\"01 02 03 04 05\",\"email\":\"test@test.fr\",\"pedestria\":\"0\",\"notes\":\"Ici quelques infos pratiques...\"}<br />\n<b>Notice</b>:  Undefined variable: contrats in <b>/var/www/html/gestion2/client-data.php</b> on line <b>100</b><br />\nnull"
 

Si dans ma requête je supprime GROUP BY contrats.id_contrat et ORDER BY contrats.id_contrat DESC, j'ai toujours une erreur mais cette fois ci avec ce message dans la console : 

responseText: "{\"id\":\"74\",\"type\":\"0\",\"nom\":\"ARNAUD Alain\",\"civilite\":\"M.\",\"contact\":\"\",\"adresse\":\"145 rue des Platanes\",\"cp\":\"75001\",\"ville\":\"PARIS\",\"pays\":\"France\",\"telephone\":\"01 02 03 04 05\",\"email\":\"test@test.fr\",\"pedestria\":\"0\",\"notes\":\"Ici quelques infos pratiques...\"}[{\"id_contrat\":null,\"facture\":null,\"date_contrat\":null,\"batiment\":null,\"date_debut\":null,\"date_fin\":null,\"total_contrat\":null,\"etat\":null}]"
 

Quelqu'un peut-il me dire où ça cloche ?
Merci d'avance !

// Chargement de la fiche client qui vient d'être activé :
$.ajax({
    type: 'POST',
    url: 'client-data.php',
    data: {
        id_client: arg
    },
    dataType: "json",
    success: function(response) {
        /*console.log('success ajax',response);*/

        document.getElementById("nomclient").innerHTML = response.nom;
        document.getElementById("villeclient").innerHTML = response.ville;

        document.getElementById("adresseclient").innerHTML = response.adresse;
        document.getElementById("cpclient").innerHTML = response.cp;
        document.getElementById("villeclient2").innerHTML = response.ville;
        document.getElementById("paysclient").innerHTML = response.pays;
        document.getElementById("contactclient").innerHTML = response.contact;

    },
    error: function(response) {
        console.log('erreur ajax', response);
        alert("Erreur Ajax");
    }
});

client-data.php

<?php
require ("connexion.php");
if(!empty($_POST["id_client"])){

    // 1. Requête recherche fiche client : 
    $requete_client = $bdd->prepare('
        SELECT clients.*, pays.nom_fr_fr AS pays
        FROM clients
        INNER JOIN pays
        ON clients.pays = pays.id_pays
        WHERE id_client = :id_client');
    $requete_client->execute(array('id_client' => $_POST['id_client']
    ));

    // 2. Requête contrats clients :
    $requete_contrats = $bdd->prepare('
        SELECT contrats.*, batiments.designation AS batiment, SUM(T.total) AS TOTAL_CONTRAT
        FROM (SELECT id_contrat,prix*quantites AS total FROM compositions) AS T
        INNER JOIN contrats
        ON contrats.id_contrat = T.id_contrat
        INNER JOIN batiments
        ON batiments.id_batiment = contrats.id_batiment
        WHERE contrats.id_client = :id_client
        GROUP BY contrats.id_contrat
        ORDER BY contrats.id_contrat DESC
    ');
    $requete_contrats->execute(array(':id_client' => $_POST['id_client'])); 


    // Récupération fiche client :
    while($donnees_client = $requete_client->fetch()) {
        $idclient =$donnees_client['id_client'];
        $type = $donnees_client['type'];
        if($donnees_client['prenom']<>''){
            $nom = $donnees_client['nom'] . ' ' . $donnees_client['prenom'];
        }
        else {
            $nom= $donnees_client['nom'];
        }
        $civilite = $donnees_client['civilite'];
        $contact = $donnees_client['contact'];
        $adresse = $donnees_client['adresse'];
        $cp = $donnees_client['cp'];
        $ville = $donnees_client['ville'];
        $pays = $donnees_client['pays'];        
        $telephone = sprintf("%s %s %s %s %s",
            substr($donnees_client['telephone'], 0, 2),
            substr($donnees_client['telephone'], 2, 2),
            substr($donnees_client['telephone'], 4, 2),
            substr($donnees_client['telephone'], 6, 2),
            substr($donnees_client['telephone'], 8, 2)
        );
        $email = $donnees_client['email'];
        $pedestria = $donnees_client['pedestria'];
        $notes = $donnees_client['notes'];
        

        $client = array(
            'id' => $idclient,
            'type' => $type,
            'nom' => $nom,
            'civilite' => $civilite,
            'contact' => $contact,            
            'adresse' => $adresse,
            'cp' => $cp,
            'ville' => $ville,
            'pays' => $pays,
            'telephone' => $telephone,
            'email' => $email,
            'pedestria' => $pedestria,
            'notes' => $notes            
        );
    }

    // Récupération des contrats du client : 
    while ($data_contrat = $requete_contrats->fetch()) {
        $id_contrat = $data_contrat['id_contrat'];
        $facture = $data_contrat['facture'];
        $date_contrat = $data_contrat['date_contrat'];
        $batiment = $data_contrat['batiment'];
        $date_debut = $data_contrat['date_debut'];
        $date_fin = $data_contrat['date_fin'];
        $total_contrat = $data_contrat['TOTAL_CONTRAT'];
        $etat = $data_contrat['etat'];

        $contrats[] = array(
            'id_contrat' => $id_contrat,
            'facture' => $facture,
            'date_contrat' => $date_contrat,
            'batiment' => $batiment,
            'date_debut' => $date_debut,
            'date_fin' => $date_fin,
            'total_contrat' => $total_contrat,
            'etat' => $etat
        );
    }

// Conversions en JSON 
    echo json_encode($client);
    echo json_encode($contrats);
}
?>

Edit : echo json_encode($contrats[]); donne cette erreur : responseText: "<br />\n<b>Fatal error</b>: Cannot use [] for reading in <b>/var/www/html/gestion2/client-data.php</b> on line <b>100</b><br />\n" 

8 réponses

Résumé de la discussion

Plusieurs échanges portent sur l'extension d'une requête Ajax qui retourne les données d'un client au format JSON afin de récupérer simultanément les contrats associés sans provoquer d'erreurs. Des problèmes côté serveur apparaissent, notamment une variable contrats indéfinie, des résultats JSON à deux objets distincts et des tentatives mal gérées d'assemblage des données client et contrats. Plusieurs approches ont été évoquées, notamment l'élimination du GROUP BY et de l'ORDER BY, la construction manuelle de l'array contrats, ou l'encodage d'un seul JSON combiné via json_encode(array($client, $contrats)). Enfin, certains suggèrent de tester la page PHP en dehors d'AJAX et d'utiliser des méthodes robustes de gestion d'erreur Ajax pour clarifier les cas d'absence de contrats et les formats JSON retournés.

Bobot (l’IA à votre service)
  1. Contributeur Ambassadeur

    bonjour,

    ton code PHP ne prévoit pas le cas où la requête ne retourne aucun contrat, d'où l'erreur en ligne 100.

    0
    1. Merci yg_be.... Je teste ça tout de suite !
      Si les champs dans la bdd contiennent des caractères comme des / ou des ' ; , .   ça pose problème ? 

      0
      1. J'ai modifié la partie concernant les contrats de cette manière : 

        $requete_contrats->execute(array(':id_client' => $_POST['id_client'])); 
            $nbr_contrats = $requete_contrats->rowCount();
            if($nbr_contrats>0){
                // Récupération des contrats du client : 
                while ($data_contrat = $requete_contrats->fetch()) {
                    $id_contrat = $data_contrat['id_contrat'];
                    $facture = $data_contrat['facture'];
                    $date_contrat = $data_contrat['date_contrat'];
                    $batiment = $data_contrat['batiment'];
                    $date_debut = $data_contrat['date_debut'];
                    $date_fin = $data_contrat['date_fin'];
                    $total_contrat = $data_contrat['TOTAL_CONTRAT'];
                    $etat = $data_contrat['etat'];
        
                    $contrats[] = array(
                        'id_contrat' => $id_contrat,
                        'facture' => $facture,
                        'date_contrat' => $date_contrat,
                        'batiment' => $batiment,
                        'date_debut' => $date_debut,
                        'date_fin' => $date_fin,
                        'total_contrat' => $total_contrat,
                        'etat' => $etat
                    );
                }
                // Conversions en JSON 
                echo json_encode($contrats);
            }

        Maintenant, les clients qui n'ont pas de contrats n'ont plus d'erreur, mais les autres en ont toujours ! 
        Le problème c'est que la console ne m'aide pas !
        "[{"id_contrat":"597","facture":"548","date_contrat":"2022-06-21","batiment":"CHAMBRE","date_debut":"2022-07-28","date_fin":"2022-07-29","total_contrat":"75.0000","etat":"3"}]{"id":"52","type":"0","nom":"XXXX Marc-Antoine","civilite":"","contact":"","adresse":"81 B rue E R","cp":"75000","ville":"PARIS","pays":"\u00celes Cocos (Keeling)","telephone":"06 07 08 09 10","email":"XXXX@gmail.com","pedestria":"0","notes":"lit parapluie"}"

         

        0
        1. L'array $contrat[] se construit mal je pense : 
          [{"id_contrat":"547","facture":"521","date_contrat":"2022-05-14","batiment":"TABLE D'H\u00d4TES","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"3336.0000","etat":"3"},{"id_contrat":"546","facture":"521","date_contrat":"2022-05-14","batiment":"JARDIN","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"822.4000","etat":"3"},{"id_contrat":"545","facture":"521","date_contrat":"2022-05-14","batiment":"VILLAGE","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"1847.6000","etat":"3"}]"

          Il devrait être plutôt comme ça non ?
          [0]{"id_contrat":"547","facture":"521","date_contrat":"2022-05-14","batiment":"TABLE D'H\u00d4TES","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"3336.0000","etat":"3"},{"id_contrat":"546","facture":"521","date_contrat":"2022-05-14","batiment":"JARDIN","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"822.4000","etat":"3"}
          [1]{"id_contrat":"545","facture":"521","date_contrat":"2022-05-14","batiment":"VILLAGE","date_debut":"2022-05-30","date_fin":"2022-06-03","total_contrat":"1847.6000","etat":"3"}

          0
        2. Contributeur Ambassadeur

          As-tu testé ta page PHP sans passer par Ajax?

          0
        3. @yg_be

          NON...
          Voici le résultat avec en début un $_POST['id_client']=18;

          {"id":"18","type":"1","nom":"XXXXX Serge","civilite":"M.","contact":"","adresse":"3 impasse B","cp":"75000","ville":"PARIS","pays":"France","telephone":"06 07 08 09 10","email":"xxxxx@gmail.com","pedestria":"0","notes":null}[{"id_contrat":"532","facture":"523","date_contrat":"2022-04-23","batiment":"JARDIN","date_debut":"2022-05-20","date_fin":"2022-05-22","total_contrat":"509.8000","etat":"3"},{"id_contrat":"531","facture":"523","date_contrat":"2022-04-23","batiment":"VILLAGE","date_debut":"2022-05-20","date_fin":"2022-05-22","total_contrat":"1318.2000","etat":"3"}]

          0
        4. @yg_be

          J'ai essayé avec des GET, y compris dans le type Ajax, c'est idem !

          0
        5. Contributeur Ambassadeur
          @emrh

          N'est-ce pas bizarre d'envoyer deux messages json?  Moi j'essaierais avec un seul.

          0
      2. Contributeur Ambassadeur

        Je me demande aussi si il n'est pas utile de mieux analyser les cas d'erreurs Ajax:

        error: function(response, exception) {
                console.log('erreur ajax: ', response.status, ', exc: ', exception, ', rep: ',response);
                alert("Erreur Ajax");
            }
        0
        1.  Erreur pour un client qui n'a pas de contrats, pour tous les autres ça fonctionne...
          J'ai fait 2 requêtes Ajax sur 2 pages php différentes

          0
        2. Contributeur Ambassadeur
          @emrh

          Quelle est la réponse du php pour un client qui n'a pas de contrat?  Cela est visible soit via la console, soit en appelant la page en direct.
          Ajax indique "parseerror", comme si le json était mal formé.

          0
        3. @yg_be

          Page contrats seuls (contrats-data.php)
          $_POST['id_client']=74;
          La page reste blanche puisque le while est échappé par :
          $nbr_contrats = $requete_contrats->rowCount();
              if($nbr_contrats>0){

          Page d'origine avec appel du client et de ses contrats : 
          {"id":"74","type":"0","nom":"ARNAUD Alain","civilite":"M.","contact":"","adresse":"145 rue des Platanes","cp":"75001","ville":"PARIS","pays":"France","telephone":"01 02 03 04 05","email":"test@test.fr","pedestria":"0","notes":"Ici quelques infos pratiques..."}

          0
        4. Contributeur Ambassadeur
          @yg_be

          La réponse est aussi visible ainsi:

          console.log('erreur ajax: ', resp.status, ', exc: ', exception, ', rep: ',resp.responseText);
          0
        5. @yg_be

          Un client sans contrat n'a plus d'erreur puisque au post <1> tu me faisais remarquer que j'avais une requête qui pouvait retourner aucun contrat, du coup je l'ai neutralisée avec : 
          $nbr_contrats = $requete_contrats->rowCount();
              if($nbr_contrats>0){

          0
      3. Comme ça devient fouillis dans ma tête, voici où j'en suis : 

         

        // Chargement de la fiche client qui vient d'être activé :
                    $.ajax({
                        type:'POST',
                        url:'client-data.php',
                        data:{id_client:arg},
                        dataType:"json",             
                        success:function(response){
                            console.log('success ajax',response);
        
                            document.getElementById("nomclient").innerHTML = response.nom;
                            document.getElementById("villeclient").innerHTML = response.ville;
        
                            document.getElementById("adresseclient").innerHTML = response.adresse;
                            document.getElementById("cpclient").innerHTML = response.cp;
                            document.getElementById("villeclient2").innerHTML = response.ville;
                            document.getElementById("paysclient").innerHTML = response.pays;
                            document.getElementById("contactclient").innerHTML = response.contact;
                            
                        },
                        error:function(response){
                            /*console.log('erreur ajax',response);*/
                            console.log('erreur ajax: ', response.status, ', exc: ', exception, ', rep: ',response.responseText);
                            alert("Erreur Ajax");                  
                        }
                    });
        
        
                    /*$.ajax({
                        type:'POST',
                        url:'contrats-data.php',
                        data:{id_client:arg},
                        dataType:"json",             
                        success:function(response){
                            console.log('success ajax',response);
                        },
                        /*error:function(response){
                          console.log('erreur ajax',response);
                          alert("Erreur Ajax");                  
                        }*/
                        /*error: function(response, exception) {
                        console.log('erreur ajax: ', response.status, ', exc: ', exception, ', rep: ',response);
                        alert("Erreur Ajax");
                        }
                    });*/
                }
        

        client-data.php

        <?php
        require ("connexion.php");
        if(!empty($_POST["id_client"])){
        
            // 1. Requête recherche fiche client : 
            $requete_client = $bdd->prepare('
                SELECT clients.*, pays.nom_fr_fr AS pays
                FROM clients
                INNER JOIN pays
                ON clients.pays = pays.id_pays
                WHERE id_client = :id_client');
            $requete_client->execute(array('id_client' => $_POST['id_client']
            ));
        
            // Récupération fiche client :
            while($donnees_client = $requete_client->fetch()) {
                $idclient =$donnees_client['id_client'];
                $type = $donnees_client['type'];
                if($donnees_client['prenom']<>''){
                    $nom = $donnees_client['nom'] . ' ' . $donnees_client['prenom'];
                }
                else {
                    $nom= $donnees_client['nom'];
                }
                $civilite = $donnees_client['civilite'];
                $contact = $donnees_client['contact'];
                $adresse = $donnees_client['adresse'];
                $cp = $donnees_client['cp'];
                $ville = $donnees_client['ville'];
                $pays = $donnees_client['pays'];        
                $telephone = sprintf("%s %s %s %s %s",
                    substr($donnees_client['telephone'], 0, 2),
                    substr($donnees_client['telephone'], 2, 2),
                    substr($donnees_client['telephone'], 4, 2),
                    substr($donnees_client['telephone'], 6, 2),
                    substr($donnees_client['telephone'], 8, 2)
                );
                $email = $donnees_client['email'];
                $pedestria = $donnees_client['pedestria'];
                $notes = $donnees_client['notes'];
                
        
                $client = array(
                    'id' => $idclient,
                    'type' => $type,
                    'nom' => $nom,
                    'civilite' => $civilite,
                    'contact' => $contact,            
                    'adresse' => $adresse,
                    'cp' => $cp,
                    'ville' => $ville,
                    'pays' => $pays,
                    'telephone' => $telephone,
                    'email' => $email,
                    'pedestria' => $pedestria,
                    'notes' => $notes            
                );
            } 
        
            // 2. Requête contrats clients :
            $requete_contrats = $bdd->prepare('
                SELECT contrats.*, batiments.designation AS batiment, SUM(T.total) AS TOTAL_CONTRAT
                FROM (SELECT id_contrat,prix*quantites AS total FROM compositions) AS T
                INNER JOIN contrats
                ON contrats.id_contrat = T.id_contrat
                INNER JOIN batiments
                ON batiments.id_batiment = contrats.id_batiment
                WHERE contrats.id_client = :id_client
                GROUP BY contrats.id_contrat
                ORDER BY contrats.id_contrat DESC
            ');   
        
            $requete_contrats->execute(array(':id_client' => $_POST['id_client'])); 
            $nbr_contrats = $requete_contrats->rowCount();
            if($nbr_contrats>0){
                // Récupération des contrats du client : 
                while ($data_contrat = $requete_contrats->fetch()) {
                    $id_contrat = $data_contrat['id_contrat'];
                    $facture = $data_contrat['facture'];
                    $date_contrat = $data_contrat['date_contrat'];
                    $batiment = $data_contrat['batiment'];
                    $date_debut = $data_contrat['date_debut'];
                    $date_fin = $data_contrat['date_fin'];
                    $total_contrat = $data_contrat['TOTAL_CONTRAT'];
                    $etat = $data_contrat['etat'];
        
                    $contrats[] = array(
                        'id_contrat' => $id_contrat,
                        'facture' => $facture,
                        'date_contrat' => $date_contrat,
                        'batiment' => $batiment,
                        'date_debut' => $date_debut,
                        'date_fin' => $date_fin,
                        'total_contrat' => $total_contrat,
                        'etat' => $etat
                    );
                }
                // Conversions en JSON
                echo json_encode($client); 
                echo json_encode($contrats);
                /*json_encode(array($client, $contrats));*/
            }
            else{
                // Conversions en JSON 
                echo json_encode($client); 
            }
        }
        0
        1. clients.php:1231 Uncaught ReferenceError: exception is not defined
              at Object.error (clients.php:1231:78)
              at c (jquery.min.js:2:28327)
              at Object.fireWith [as rejectWith] (jquery.min.js:2:29072)
              at l (jquery.min.js:2:79926)
              at XMLHttpRequest.<anonymous> (jquery.min.js:2:82355)
          error @ clients.php:1231
          c @ jquery.min.js:2
          fireWith @ jquery.min.js:2
          l @ jquery.min.js:2
          (anonyme) @ jquery.min.js:2
          load (asynchrone)
          send @ jquery.min.js:2
          ajax @ jquery.min.js:2
          listGroupActive @ clients.php:1211
          onclick @ clients.php:83
          jquery.min.js:2 XHR a fini de se charger : POST "http://127.0.0.1/gestion2/client-data.php".

          0
        2. Contributeur Ambassadeur

          Les lignes 20 et 22 de ton fichier html devraient être:

             error: function(resp, exception) {
                  console.log('erreur ajax: ', resp.status, ', exc: ', exception, ', rep: ',resp.responseText);
          
          0
      4. Si je décommente le premier code pour le traitement de l'erreur Ajax, j'ai l'impression que l'Array n'a pas les indices [0]  [1]  [2]...

        0
        1. Contributeur Ambassadeur

          Merci de partager des faits, pas uniquement des impressions.

          0
        2. Contributeur Ambassadeur

          Moi j'ai l'impression que tu es en train de tester de multiples modifications, sans prendre le temps de réfléchir.

          0
        3. @yg_be

          Au contraire, j'ai l'impression que de 8h00 à 15h00 j'ai pas mal réfléchi !  :-(
          Je ne connais pas les méthodes de débogage donc je regarde des vidéos, lis des tutos et doc et tente de mettre en pratique, ensuite je post les résultats de mes essais ; Je suis désolé si cela parasite la réflexion...Mais comment interagir avec ce forum si ce n'est en postant ce que j'essai de faire ?


          Par exemple, je ne sais pas si ça fait avancer la réflexion mais ce matin, j'ai remplacé dataType:"json" par dataType:"text" et j'obtiens un success en console avec le retour client + le retour contrats (ou  retour client seulement si pas de contrat)... testé sur plusieurs clients
          Evidemment les innerHTML = response.nom; ne fonctionne plus ! (undefined)...

          0
      5. // Chargement de la fiche client qui vient d'être activé :
        // ------------------------ C L I E N T ----------------------
        $.ajax({
        	type: 'POST',
        	url: 'client-data.php',
        	data: {
        		id_client: arg
        	},
        	dataType: "json",
        	success: function(response) {
        		console.log('success ajax', response);
        
        		document.getElementById("nomclient").innerHTML = response.nom;
        		document.getElementById("villeclient").innerHTML = response.ville;
        
        		document.getElementById("adresseclient").innerHTML = response.adresse;
        		document.getElementById("cpclient").innerHTML = response.cp;
        		document.getElementById("villeclient2").innerHTML = response.ville;
        		document.getElementById("paysclient").innerHTML = response.pays;
        	},
        	error: function(response) {
        		console.log('erreur ajax', response);
        	}
        });
        
        // ------------------------ C O N T R A T S ----------------------
        $.ajax({
        	type: 'POST',
        	url: 'contrats-data.php',
        	data: {
        		id_client: arg
        	},
        	dataType: "json",
        	success: function(response2) {
        		console.log('success ajax', response2);
        		document.getElementById("contratnum").innerHTML = response2[0].id_contrat;
        
        	},
        	error: function(response2) {
        		console.log('erreur ajax', response2);
        	}
        });

        client-data.php

        <?php
        require ("connexion.php");
        if(!empty($_POST["id_client"])){
            // 1. Requête recherche fiche client : 
            $requete_client = $bdd->prepare('
                SELECT clients.*, pays.nom_fr_fr AS pays
                FROM clients
                INNER JOIN pays
                ON clients.pays = pays.id_pays
                WHERE id_client = :id_client');
            $requete_client->execute(array('id_client' => $_POST['id_client']
            ));
        
            // Récupération fiche client :
            while($donnees_client = $requete_client->fetch()) {
                $idclient =$donnees_client['id_client'];
                $type = $donnees_client['type'];
                if($donnees_client['prenom']<>''){
                    $nom = $donnees_client['nom'] . ' ' . $donnees_client['prenom'];
                }
                else {
                    $nom= $donnees_client['nom'];
                }
                $civilite = $donnees_client['civilite'];
                $contact = $donnees_client['contact'];
                $adresse = $donnees_client['adresse'];
                $cp = $donnees_client['cp'];
                $ville = $donnees_client['ville'];
                $pays = $donnees_client['pays'];        
                $telephone = sprintf("%s %s %s %s %s",
                    substr($donnees_client['telephone'], 0, 2),
                    substr($donnees_client['telephone'], 2, 2),
                    substr($donnees_client['telephone'], 4, 2),
                    substr($donnees_client['telephone'], 6, 2),
                    substr($donnees_client['telephone'], 8, 2)
                );
                $email = $donnees_client['email'];
                $pedestria = $donnees_client['pedestria'];
                $notes = $donnees_client['notes'];
                
        
                $client = array(
                    'id' => $idclient,
                    'type' => $type,
                    'nom' => $nom,
                    'civilite' => $civilite,
                    'contact' => $contact,            
                    'adresse' => $adresse,
                    'cp' => $cp,
                    'ville' => $ville,
                    'pays' => $pays,
                    'telephone' => $telephone,
                    'email' => $email,
                    'pedestria' => $pedestria,
                    'notes' => $notes            
                );
            }
            // Conversions en JSON 
            echo json_encode($client);
        }
        ?>

        contrats-data.php

        <?php
        require ("connexion.php");
        if(!empty($_POST["id_client"])){
            // 2. Requête contrats clients :
            $requete_contrats = $bdd->prepare('
                SELECT contrats.*, batiments.designation AS batiment, SUM(T.total) AS TOTAL_CONTRAT
                FROM (SELECT id_contrat,prix*quantites AS total FROM compositions) AS T
                INNER JOIN contrats
                ON contrats.id_contrat = T.id_contrat
                INNER JOIN batiments
                ON batiments.id_batiment = contrats.id_batiment
                WHERE contrats.id_client = :id_client
                GROUP BY contrats.id_contrat
                ORDER BY contrats.id_contrat DESC
            ');
            $requete_contrats->execute(array(':id_client' => $_POST['id_client']));    
            $nbr_contrats = $requete_contrats->rowCount();
            if($nbr_contrats>0){
                // Récupération des contrats du client : 
                while ($data_contrat = $requete_contrats->fetch()) {
                    $id_contrat = $data_contrat['id_contrat'];
                    $facture = $data_contrat['facture'];
                    $date_contrat = $data_contrat['date_contrat'];
                    $batiment = $data_contrat['batiment'];
                    $date_debut = $data_contrat['date_debut'];
                    $date_fin = $data_contrat['date_fin'];
                    $total_contrat = $data_contrat['TOTAL_CONTRAT'];
                    $etat = $data_contrat['etat'];
        
                    $contrats[] = array(
                        'id_contrat' => $id_contrat,
                        'facture' => $facture,
                        'date_contrat' => $date_contrat,
                        'batiment' => $batiment,
                        'date_debut' => $date_debut,
                        'date_fin' => $date_fin,
                        'total_contrat' => $total_contrat,
                        'etat' => $etat
                    );
                }
        
                // Conversions en JSON 
                echo json_encode($contrats);
            }
        }
        ?>
        0
        1. Ça fonctionne pour des clients avec contrats...
          Par contre, il faut maintenant que j'arrive à traiter le retour des réponses sans contrats ! 

          0
        2. Contributeur Ambassadeur
          @emrh

          En effet.  Que devrait-il se passer dans ce cas?

          0
      6. Sur la page contrats-data.php je vais faire un else, du coup mon if aura son else : 
        else{
                $contrats="Ce client n'a pas de contrat";
                // Conversions en JSON 
                echo json_encode($contrats);
        }

        Il faut maintenant gérer ça dans le success:function(response2){

        0
        1. La requête Ajax est contente, elle a sa réponse, je ne génère donc plus d'erreur !

          Je peux même construire l'Array à la main : 
          else{
                  $contrats[] = array(
                          'id_contrat' => '',
                          'facture' => '',
                          'date_contrat' => '',
                          'batiment' => '',
                          'date_debut' => '',
                          'date_fin' => '',
                          'total_contrat' => '',
                          'etat' => ''
                      );
                  // Conversions en JSON 
                  echo json_encode($contrats);
              }

          1