Requête Ajax et double objet JSON
Résoluemrh Messages postés 427 Date d'inscription Statut Membre Dernière intervention -
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"
- Requête Ajax et double objet JSON
- Double ecran - Guide
- Whatsapp double sim - Guide
- Double driver - Télécharger - Pilotes & Matériel
- Double appel - Guide
- Double boot - Guide
8 réponses
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.
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 ?
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"}"
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"}
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"}]
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"); }
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..."}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionComme ç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); } }
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".
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]...
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)...
// 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); } } ?>
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){
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);
}