Affecter une variable par des requetes imbriquées ?

Résolu
Bonjour à tous,

Dans la WebApplication que je développe, j'ai besoin de récupérer des informations dans différentes
tables, liées entre elles par une clé étrangère. Une fois récoltées, j'aimerai concaténer toutes ces data
dans une variable que je passerai à Javascript pour la partie locale et dynamique.

1. Pour vérifier mes requêtes, j'arrive à faire un print du résultat, ça fonctionne mais je ne suis certain
que la méthode employée n'est pas la bonne ! En effet, j'ai utilisé des requêtes imbriquées les unes
dans les autres !!!

2. Je ne trouve pas le moyen de créer une variable commençant par |
Les différents résultats par contre sont bien séparés par un ; par contre dans :
print $prestation['designation'] . ';';

3. var chaine_contrat="<?php echo $chaine_contrat?>";
Est-ce une syntaxe correcte pour passer ma chaine PHP (une fois que j'aurai réussi à la construire)
dans mon script ?

Merci d'avance pour votre aide (ou pistes de recherches)

// Si l'ID contrat existe, on va chercher toutes les données du contrat à afficher :
        // CONTRAT :
        require ("connexion.php");
        $requete1 = $bdd->prepare('SELECT * FROM contrats WHERE id_contrat = :id_contrat');
        $requete1->execute(array(
            'id_contrat' => $_GET['id_contrat']
        ));
        $entete_contrat = $requete1->fetch();
        // On récupère aussi la composition du contrat à afficher :
        $requete2 = $bdd->prepare('SELECT * FROM compositions WHERE id_contrat = :id_contrat');
        $requete2->execute(array(
            'id_contrat' => $_GET['id_contrat']
        ));        
        $composition_contrat = $requete2->fetchAll();
        foreach ($composition_contrat as $data) {
            // On récupère ici la désignation de la prestation :
            $requete2bis = $bdd->prepare('SELECT designation FROM prestations WHERE id_prestation = :id_prestation');
            $requete2bis->execute(array(
                'id_prestation' => $data['id_prestation']
            ));
            $prestation = $requete2bis->fetch(); 
            print $prestation['designation'] . ';';
        }
        echo '<br>';
        print_r ($entete_contrat);
        echo '<br>';
        print_r ($composition_contrat);
        echo '<br>';
        print_r ($prestation);
        echo '<br>';

5 réponses

  1. Contributeur
    bonjour,
    as-tu déjà étudié les jointures en SQL?
    0
    1. Merci @yg_be
      Je n'avais jamais eu besoin de ces fonctionnalités donc j'avais survolé
      puis oublié ce chapitre... C'est bien moins usine à gaz que mes requêtes
      imbriquées ! Je vais regarder ça de près..., je viendrai poster ici ce que j'aurai
      écrit.
      Que me conseilles-tu pour mettre le résultat des réponses trouvées
      (quelques fois plusieurs lignes) dans la deuxième table dans une variable ?
      En fait, j'aimerai pouvoir concaténer les réponses comme ça :
      |designation1;prix1;quantites1|designation2;prix2;quantites2|designation3;prix3;quantites3...
      Je suppose qu'il faut inclure la concaténation dans une boucle style foreach ou while,
      mais je ne vois pas comment écrire ça...
      0
      1. Avt de faire du code PHP, j'essaie déjà de faire mes requêtes dans PhpMyAdmin mais ça ne fonctionne pas..
        J'ai essayé dans plusieurs syntaxe la commande suivante :

        SELECT prestations.designation,compositions.prix, compositions.quantites
        FROM prestations, compositions
        WHERE prestations.id_prestation=compositions.id_prestation
        AND contrats.id_contrat=62
        
        0
        1. Contributeur
          "ça ne fonctionne pas": peux-tu nous en dire plus?
          0
      2. J'avais soit des messages d'erreur de syntaxe sql soit j'avais l'intégralité d'une table...
        J'ai regardé ce tuto https://www.youtube.com/watch?v=umB_0eDOrp8&feature=youtu.be et appliqué la première jointure,
        c'est à dire celle d'INNER JOIN et ça fonctionne... Enfin presque !

        Voici mon code sql de test :
        SELECT * FROM compositions
        INNER JOIN prestations
        ON prestations.id_prestation=compositions.id_prestation
        WHERE compositions.id_contrat=62
        


        J'ai bien la totalité de la table compositions grace à * mais je
        ne veux pas l'intégralité de prestations car prestations contient
        'prix' qui est le prix proposé par défaut à l'utilisateur qui peut
        être changé et qui est enregistré dans la table compositions
        une fois le formulaire validé...
        Comment faire pour ne récupérer QUE la prestations.designation
        si son prestation.id_prestation = compositions.id_prestation ?

        SELECT prestations.designation,compositions.quantites, compositions.prix FROM compositions, prestations
        

        me donne :
        MySQL a répondu : Documentation
        #1066 - Table/alias: 'prestations' non unique
        0
        1. Après une multitude d'essais :

          SELECT prestations.designation,compositions.quantites, compositions.prix FROM compositions
          INNER JOIN prestations
          ON prestations.id_prestation=compositions.id_prestation
          WHERE compositions.id_contrat=62
          


          Me donne :
          Chambre côté Village (1 personne) 1 50.00

          C'est exactement ce que je cherchais !
          0