Bonjour
J'ai créé une requête ajax pour recuperer des donnée dans une BDD
Du coté PHP tout est ok
Mais du coté JS j'ai un retour "undefined" dans ma variable tableauRepertoire
Quand je mets une console.log(valeurs) dans request.done, les données sont OK
let tableauRepertoire = datasRepertoire(urlPage);
console.log(tableauRepertoire);
function datasRepertoire(page) {
let request = $.ajax({
url: page,
dataType: 'json'
});
request.done(function (valeurs) {
if (valeurs.length > 0) {
return valeur;
}
});
request.fail(function (jqHXR, textStatus) {
alert('erreur dans la requete: ' + textStatus);
});
}
_______________________________________________
public function selectRepertoire()
{
$dossier = (new DocumentsModel)->selectDeplaRep();
// On return le resulat
echo json_encode($dossier);
die;
}
______________________________________________________
public function selectDeplaRep()
{
// On prepare la requette de l'id
$sql = 'SELECT dossier.id, dossier.libelle, dossier.parent FROM dossier WHERE dossier.statut=:statut ORDER BY dossier.parent ASC, dossier.libelle ASC';
// On crée un tableau pour la rquette
$data = [
':statut' => 1
];
// On envoie la requette a PDO
$req = $this->getPDO()->prepare($sql);
// On définit le mode de récupération par défaut pour cette requête
$req->setFetchMode(PDO::FETCH_CLASS, 'DocumentsModel');
// On execute la requette sql
$req->execute($data);
$datas = $req->fetchAll();
return $datas;
}
Bonjour,
Pas beaucoup de connaisance en JS. ça ne serait pas "return valeurs" ?
On dit "requête" et non "requette".
Quelle est l'intérêt de faire une requête préparer si c'est pour mettre une valeur fixe ?
Bonjour,
J’ai utilisé ajax pour pouvoir récupéré des données en BDD, de stoker ses données dans des variable JS pour les utilisés suivant les cliques des utilisateurs sans avoir besoin de recharger la page.
Les données sont bien récupérées mais, je n’arrive pas à lés stocker dans les variables JS
Avez-vous une solution ?
Comme l'a dit Carouge10, tu fais un return valeur;
au lieu d'un return valeurs
dans ton request.done
Je vous remercie pour votre réponse, j’ai fait la correction de mon return valeur en valeurs, mais j’ai toujours le même problème.
Je pense que ça doit venir que j’utilise « jQuery » pour ajax.
Je vais regarder pour utiliser « fetch »
Il me semble qu'avec jQuery, on est obligé de tout mettre en une fois, sans passer par une variable (Ma connaissance en jQuery est innexistante à l'heure actuelle).
Essaie avec quelque chose comme ça pour voir :
function datasRepertoire(page) {
$.ajax({
url: page,
dataType: 'json'
})
.done(function (valeurs) {
if (valeurs.length > 0) {
return valeurs;
}
})
.fail(function (jqHXR, textStatus) {
alert('erreur dans la requete: ' + textStatus);
});
}
Après consultation de la doc, il faudrait plutôt faire quelque chose comme ceci :
let tableauRepertoire;
datasRepertoire(urlPage);
console.log(tableauRepertoire);
function datasRepertoire(page) {
let request = $.ajax({
url: page,
dataType: 'json'
});
request.done(function (valeurs) {
if (valeurs.length > 0) {
tableauRepertoire = valeurs;
}
});
request.fail(function (jqHXR, textStatus) {
alert('erreur dans la requete: ' + textStatus);
});
}
Bonjour, je vous remercie pour ces infos mais je vais aller voir "FETCH" car avec jQuery et ajax cela ne fontionne toujours pas.
C'est complètement normal que tu n'obtiennes pas de réponse tout de suite. Les requêtes AJAX en JavaScript sont asynchrones, ce qui signifie que la fonction continue de s'exécuter sans attendre que la réponse du serveur soit arrivée. Si tu ne "await/then" pas la réponse, tu n'auras jamais accès aux données récupérées par la requête.
En gros, ce qu'il se passe, c'est que ta fonction continue son exécution sans attendre que la réponse soit revenue du serveur. Pour que ton code fonctionne correctement, tu dois faire en sorte que l'exécution attende que la réponse soit disponible avant de continuer. Pour cela, tu peux utiliser async/await ou then qui permet de gérer l'asynchronie de manière plus simple et plus lisible.
Voici un exemple de comment tu pourrais structurer ton code :
async function datasRepertoire(page) {
try {
let request = $.ajax({
url: page,
dataType: 'json'
});
let valeurs = await request;
return valeurs.length > 0 ? valeurs : [];
} catch (error) {
throw new Error('Erreur dans la requête: ' + error.statusText);
}
}
let tableauRepertoire;
datasRepertoire(urlPage).then(res => tableauRepertoire = res);
Bonjour, je début avec ajax, mais je ne comprend pas comment sortir que la valeur et non la promise.
async function datasRepertoire(page) {
try {
let request = $.ajax({
url: page,
dataType: 'json'
});
let valeurs = await request;
return valeurs.length > 0 ? valeurs : [];
} catch (error) {
throw new Error('Erreur dans la requête: ' + error.statusText);
}
}
let tableauRepertoire;
datasRepertoire(urlPage).then(res => tableauRepertoire = res);
Promise { <state>: "pending" }
<state>: "fulfilled"
<value>: Array(4) [ {…}, {…}, {…}, … ]
0: Object { id: "1", titre: null, erreur: false, … }
1: Object { id: "9", parent: "1", erreur: false, … }
2: Object { id: "12", parent: "11", erreur: false, … }
3: Object { id: "13", parent: "11", erreur: false, … }
length: 4
<prototype>: Array []
<prototype>: Promise.prototype { … }
Ouais c'est normal c'est du au même pb d'asynchronie en faite. A l'exterieur du then ta Promise sear probablement encore en pending.
Tu dois passer par la callback pour travailler directement sur le resultat ou utiliser une autre fonction et await la réponse.
datasRepertoire(urlPage).then(res => {
const tableauRepertoire = res
// fait ce que tu as à faire dans la callback
});
ou
async function utiliserRepertoire(page) {
const tableauRepertoire = await datasRepertoire(page);
// tu peux travailler avec tableauRepertoire ici.
}