Affecter une variable par des requetes imbriquées ?

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 7 déc. 2021 à 09:55
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 8 déc. 2021 à 09:42
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

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
7 déc. 2021 à 10:38
bonjour,
as-tu déjà étudié les jointures en SQL?
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
7 déc. 2021 à 13:48
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
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
7 déc. 2021 à 15:33
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
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
7 déc. 2021 à 17:38
"ça ne fonctionne pas": peux-tu nous en dire plus?
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 8 déc. 2021 à 09:22
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
8 déc. 2021 à 09:42
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