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
-
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);
}
-
