Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jointures multiples et extraction des données

Sujet résolu
    21 février 2021 à 18:25:33

    Bonjour,

    J'ai 4 tables dont je voudrais extraire les données saisies avec pièces jointes dans un formulaire et j'y arrive mais quand il y a plusieurs documents, cela me renvoie autant de lignes qu'il y a de documents et lorsqu'il n'y a pas de documents joint, cela ne m'affiche rien.

    Je dois apparemment fire une jointure externe, mais je ne sais pas comment faire malgré avoir regardé les tutoriels.

    Je vous remercie de votre aide

    Copie d'écran de mes relations:

    Ma requête: 

    $sql = 'SELECT dde.demande_id
    ,   dde.date_dde
    ,   clt.nom
    ,   clt.email
    ,   clt.telephone
    ,   clt.ville
    ,   clt.cp
    ,   clt.adresse
    ,   dde.message
    ,   dde.ddeConcerne
    ,   dde.fonctionnalites
    ,   doc.file_path
    FROM demandes AS dde
    INNER JOIN clients AS clt
    ON clt.client_id   = dde.client_id
    INNER JOIN details AS det
    ON det.demande_id  = dde.demande_id
    INNER JOIN documents AS doc
    ON doc.document_id = det.document_id
    WHERE dde.demande_id  = "'.$_GET['demande_id'].'"
    ';



    • Partager sur Facebook
    • Partager sur Twitter
      21 février 2021 à 19:58:25

      Bonjour,

      Pour le fait qu'il y ait plusieurs lignes c'est normal, il te faut traiter cela côté programme pour faire une rupture. Exemple en PHP dans ce récent sujet : https://openclassrooms.com/forum/sujet/repondre-a-une-reponse-de-commentaire#message-94011244

      Et des tas d'autres sujets du même type sur ce forum, et sur Internet.

      Concernant les jointures externes : https://openclassrooms.com/fr/courses/1959476-administrez-vos-bases-de-donnees-avec-mysql/1963612-jointures

      Au passage, pense aux requêtes préparées :

      <?php
      	$bdd = new PDO( ... );
      	
      	$sql = '
      		SELECT
      			 D.demande_id
      			,D.date_dde
      			,C.nom
      			,C.email
      			,C.telephone
      			,C.ville
      			,C.cp
      			,C.adresse
      			,D.message
      			,D.ddeConcerne
      			,D.fonctionnalites
      			,F.file_path
      		FROM
      			demandes D
      				INNER JOIN clients C
      					ON C.client_id = D.client_id
      				LEFT JOIN details DT
      					ON DT.demande_id = D.demande_id
      				LEFT JOIN documents F
      					ON F.document_id = DT.document_id
      		WHERE D.demande_id = ?
      		ORDER BY D.demande_id, DT.detail_id;';
      	$requete = $bdd->prepare( $sql );
      	$requete->execute( [ $_GET['demande_id'] ] );
      	$demandes = $requete->fetchAll();
      ?>
      		<h1>Liste des demandes</h1>
      <?php
      	if( count( $demandes ) {
      		$demandePrecedente = 0;
      		foreach( $demandes as $demande ) {
      			// Si nouvelle demande alors on affiche la demande
      			if( $demande['demande_id'] != $demandePrecedente ) {
      ?>
      		<h2>Demande n°<?= $demande['demande_id']; ?> du <?= $demande['date_dde']; ?></h2>
      		<p><?= $demande['ddeConcerne']; ?></p>
      		<p><?= $demande['fonctionnalites']; ?></p>
      		<h3>Client</h3>
      		<p>Nom : <?= $demande['nom']; ?></p>
      		<p>Email : <?= $demande['email']; ?></p>
      		<p>Téléphone : <?= $demande['telephone']; ?></p>
      		<p>Adresse : <?= $demande['adresse']; ?> <?= $demande['cp']; ?> <?= $demande['ville']; ?></p>
      		<h3>Documents</h3>
      <?php
      			}
      			// Dans tous les cas on affiche le document
      			if( $demande['file_path'] ) {
      ?>
      		<p><a href="<?= $demande['file_path']; ?>"></a></p>
      <?php
      			} else {
      ?>
      		<p>Aucun document.</p>
      <?php
      			}
      			// On mémorise la demande
      			$demandePrecedente = $demande['demande_id'];
      		}
      	} else {
      ?>
      		<p>Aucune demande.</p>
      <?php	
      	}
      ?>

      -
      Edité par Benzouye 22 février 2021 à 9:05:19

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        23 février 2021 à 11:30:40

        Merci pour ton travail, j'ai donc pas mal travaillé dessus hier et je n'avais pas vu que tu avais édité ton message et posté ce code. Je ne savais pas que les requêtes préparée étaient aussi importantes pour la sélection que pour l'insertion et la modification.

        Mon problème maintenant, c'est que lorsque j'insert dans mes tables les données avec 1 seul document ça se passe bien mais quand il y a plusieurs documents, cela m'insert autant de demandes et de clients qu'il y a de  documents et je ne vois pas pour le moment mon erreur.

        Voici comment je procède:

        // INSERTION CLIENT
        $sql1 = 'INSERT INTO clients (nom, email, telephone, adresse, ville, cp) VALUES  (?,?,?,?,?,?)';
         if ($stmt = $conn->prepare($sql1)) {
           $stmt->bind_param('ssssss', $nom, $email, $telephone, $adresse, $ville, $cp);
           $stmt->execute();
                        }
        
        // INSERTION DEMANDE
        $client_id = $conn->insert_id;
        $sql2 = 'INSERT INTO demandes (date_dde, client_id, ddeConcerne, fonctionnalites, message) VALUES  (?,?,?,?,?)';
            if ($stmt = $conn->prepare($sql2)) {
                $stmt->bind_param('sisss', $date_dde, $client_id, $ddeConcerne, $fonctionnalites, $message);
                $stmt->execute();
                        }
        
        // INSERTION DOCUMENTS
        $demande_id = $conn->insert_id;
           if (!empty($sqlValFile)) {
        $sql = 'INSERT INTO documents (file_path, demande_id) VALUES  (?,?)';
           if ($stmt = $conn->prepare($sql)) {
               $stmt->bind_param('si', $targetFilePath, $demande_id);
               $stmt->execute();
                            



        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2021 à 12:47:48

          baraton a écrit:

          Je ne savais pas que les requêtes préparée étaient aussi importantes pour la sélection

          Les requêtes préparées aident à se protéger des injections SQL. Dans ta requête SELECT tu passes en variables $_GET['demande_id']. Si un petit malin remplace l'id par autre chose dans l'URL, il peut "attaquer" ta base de données ... exemple : 1"; DELETE FROM documents;" ... autant dans les SELECT que dans les UPDATE ou INSERT ...

          baraton a écrit:

          lorsque j'insert dans mes tables les données avec 1 seul document ça se passe bien mais quand il y a plusieurs documents, cela m'insert autant de demandes et de clients qu'il y a de  documents

          Le code que tu postes ne montres rien ... Il fait un INSERT dans chaque table. Mais je suppose que tout ce code se trouve dans une boucle et le problème serait là ... Seul l'insertion dans document devrait être dans la boucle ...

          -
          Edité par Benzouye 23 février 2021 à 12:52:21

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            26 février 2021 à 16:41:06

            Merci, c'était bien ça.
            • Partager sur Facebook
            • Partager sur Twitter

            Jointures multiples et extraction des données

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown