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 - 23 oct. 2022 à 10:57
- Requête Ajax et double objet JSON
- Double ecran - Guide
- Whatsapp double sim - Guide
- Vente objet occasion entre particulier - Guide
- Double appel - Guide
- Double authentification google - Guide
8 réponses
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.
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 ?
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"}"
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"}
22 oct. 2022 à 11:56
As-tu testé ta page PHP sans passer par Ajax?
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"}]
22 oct. 2022 à 12:15
J'ai essayé avec des GET, y compris dans le type Ajax, c'est idem !
22 oct. 2022 à 12:47
N'est-ce pas bizarre d'envoyer deux messages json? Moi j'essaierais avec un seul.
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"); }
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
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é.
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..."}
22 oct. 2022 à 14:58
La réponse est aussi visible ainsi:
console.log('erreur ajax: ', resp.status, ', exc: ', exception, ', rep: ',resp.responseText);
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){
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question22 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); } }
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".
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);
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]...
22 oct. 2022 à 15:26
Merci de partager des faits, pas uniquement des impressions.
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.
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)...
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); } } ?>
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 !
23 oct. 2022 à 10:43
En effet. Que devrait-il se passer dans ce cas?
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){
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);
}