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

9 réponses


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.
}