Requête Ajax et double objet JSON

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - Modifié le 22 oct. 2022 à 10:02
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 23 oct. 2022 à 10:57

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" 

A voir également:

8 réponses

yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 11:17

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 11:27

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 11:44

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 22 oct. 2022 à 12:00

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
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 11:56

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

0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
22 oct. 2022 à 12:08

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
22 oct. 2022 à 12:15

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

0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
22 oct. 2022 à 12:47

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

0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 13:01

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 14:34

 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
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
22 oct. 2022 à 14:48

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
Modifié le 22 oct. 2022 à 15:00

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
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
22 oct. 2022 à 14:58

La réponse est aussi visible ainsi:

console.log('erreur ajax: ', resp.status, ', exc: ', exception, ', rep: ',resp.responseText);
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
22 oct. 2022 à 15:03

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 15:15

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 15:17

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
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 15:24

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
22 oct. 2022 à 15:20

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
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 15:26

Merci de partager des faits, pas uniquement des impressions.

0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
22 oct. 2022 à 15:28

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

0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024
23 oct. 2022 à 09:27

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
23 oct. 2022 à 10:03
// 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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
23 oct. 2022 à 10:38

Ça fonctionne pour des clients avec contrats...
Par contre, il faut maintenant que j'arrive à traiter le retour des réponses sans contrats ! 

0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
23 oct. 2022 à 10:43

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

0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
23 oct. 2022 à 10:51

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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
23 oct. 2022 à 10:57

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