Requête Ajax et double objet JSON
Résoluemrh Messages postés 439 Statut Membre -
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
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.
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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"}]
-
-
-
-
yg_be Messages postés 23437 Date d'inscription Statut Contributeur Dernière intervention Ambassadeur 1 588
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 question -
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); } }-
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]...
-
-
Moi j'ai l'impression que tu es en train de tester de multiples modifications, sans prendre le temps de réfléchir.
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);
}
-
