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