Jointure de table pour ne pas faire deux boucles

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Jointure de table pour ne pas faire deux boucles

Re: Jointure de table pour ne pas faire deux boucles

par visualight » 28 sept. 2009, 18:02

Ne vous fatiguez pas, j'ai trouvé :
$req_main="SELECT * FROM $CfgTableMain INNER JOIN $CfgTablePhotos ON ($CfgTableMain.gallery_id = $CfgTablePhotos.gallery_id) GROUP BY $CfgTableMain.gallery_id ORDER BY $CfgTableMain.gallery_date DESC";

Re: Jointure de table pour ne pas faire deux boucles

par visualight » 27 sept. 2009, 19:39

Bref, comment rendre ce code plus propre (si possible) ?
Jointure de table ? je ne sais pas ...
<?php
// On inclus le fichier de configuration
require_once ('config.inc.php');

// Connection à la base de donnée
$db = mysql_connect($CfgServerHost, $CfgServerUser, $CfgServerPassword) or die('Error #1 : Could not connect to database');
mysql_select_db($CfgDatabase,$db) or die ('Error #2 : Cannot select database');

// Requete principale qui permet d'afficher le titre, la date, le compteur de hits
$req_main="SELECT * FROM $CfgTableMain ORDER BY gallery_date DESC";
$res_main=mysql_query($req_main) or die('Error #3 : Could not execute mysql query MAIN'); 

// Boucle while principale pour l'affichage des galeries avec leur titre, date, nombre de hits, ...
while ($row = mysql_fetch_array ($res_main)) {
$galid = $row['gallery_id'];
$titlefr = $row['gallery_titlefr'];

// Requete secondaire permettant d'afficher la photo de la galerie par rapport à l'ID de la table $CfgTableMain
$req_photo="SELECT photo_filename FROM $CfgTablePhotos WHERE gallery_id=$galid LIMIT 1";
$res_photo=mysql_query($req_photo) or die('Error #3 : Could not execute mysql query PHOTOS'); 

// Affichage de la galerie
echo '<div id="galleryHome">
<div id="galleryHomeBorder">
 <div id="galleryHomeTools">
 <a href="index.html" target="_self"><img src="images/photo.png" /></a>
 <a href="index.html" target="_self"><img src="images/video.png" /></a>
 <p>Date: '.$row['gallery_date'].'<br />
   Vue: '.$row['gallery_count'].'</p>
 </div>';

// boucle while secondaire pour l'affichage de la photo 
 while ($row = mysql_fetch_array ($res_photo)) {
echo ' <a href="details.html"><img class="galleryHomePicture1" src="photos/'.$row['photo_filename'].'" width="150" height="113"
 alt="Galerie 1" /></a>';
}

 echo' <br />
<p class="galleryHomeTitle1"><a href="details.html">'.$titlefr.'</a></p>
</div>
</div>';
}
?>

Jointure de table pour ne pas faire deux boucles

par visualight » 26 sept. 2009, 18:30

Bonjour,

Je suis entrain d'essayer de réaliser une galerie photo en php dont les résultats proviennent d'une base de donnée.

Jusqu'à présent mon code fonctionne mais n'est pas des plus propre et digne. je me retourne donc vers vous pour savoir comment je puis coder correctement ce bout de code. (voir plus bas)

Mon bout de code (fonctionnel) est basé sur l'imbrication de deux boucles whiles provenant de deux tables différentes pour afficher les résultats.
Ma première table doit en effet faire appel à une seconde pour afficher une image qui sera la photo démonstrative d'une galerie.

j'ai commencé à coder comme suit et me suis vite rendu compte que ce n'était peut être pas la bonne manière pour arriver à quelque chose de convenable... mais ça marche ...
<?php
// On inclus le fichier de configuration
require_once ('config.inc.php');

// Connection à la base de donnée
$db = mysql_connect($CfgServerHost, $CfgServerUser, $CfgServerPassword) or die('Error #1 : Could not connect to database');
mysql_select_db($CfgDatabase,$db) or die ('Error #2 : Cannot select database');

// Requete principale qui permet d'afficher le titre, la date, le compteur de hits
$req_main="SELECT * FROM $CfgTableMain ORDER BY gallery_date DESC";
$res_main=mysql_query($req_main) or die('Error #3 : Could not execute mysql query MAIN'); 

// Boucle while principale pour l'affichage des galeries avec leur titre, date, nombre de hits, ...
while ($row = mysql_fetch_array ($res_main)) {
$galid = $row['gallery_id'];
$titlefr = $row['gallery_titlefr'];

// Requete secondaire permettant d'afficher la photo de la galerie par rapport à l'ID de la table $CfgTableMain
$req_photo="SELECT photo_filename FROM $CfgTablePhotos WHERE gallery_id=$galid LIMIT 1";
$res_photo=mysql_query($req_photo) or die('Error #3 : Could not execute mysql query PHOTOS'); 

// Affichage de la galerie
echo '<div id="galleryHome">
<div id="galleryHomeBorder">
 <div id="galleryHomeTools">
 <a href="index.html" target="_self"><img src="images/photo.png" /></a>
 <a href="index.html" target="_self"><img src="images/video.png" /></a>
 <p>Date: '.$row['gallery_date'].'<br />
   Vue: '.$row['gallery_count'].'</p>
 </div>';

// boucle while secondaire pour l'affichage de la photo 
 while ($row = mysql_fetch_array ($res_photo)) {
echo ' <a href="details.html"><img class="galleryHomePicture1" src="photos/'.$row['photo_filename'].'" width="150" height="113"
 alt="Galerie 1" /></a>';
}

 echo' <br />
<p class="galleryHomeTitle1"><a href="details.html">'.$titlefr.'</a></p>
</div>
</div>';
}
?> 
Comme vous pouvez le remarquer dans ce code, j'imbrique deux boucles while et je vais vous expliquer pourquoi :

Ma première table ($CfgTableMain), est composée comme suit :

- gallery_id (autoincrement)
- gallery_titlefr
- gallery_count

Ma seconde table ($CfgTablePhotos), est composée comme suit :

- gallery_id (bigint 20)
- photo_id (autoincrement)
- photo_filename

Pour créer une nouvelle galerie, il faut donc remplir les champs de la première table ($CfgTableMain). Le champ gallery_id est auto-incrémenté.
==> Nous créons donc en exemple une galerie avec l'id 1 (champ: gallery_id)

Dans la deuxième table ($CfgTablePhotos), chaque photo que l'on veut voir dans la gallerie id 1 doit avoir, dans son champ (gallery_id), l'id identique à la gallerie crée précédement en exemple (ci-dessus).

-- Exemple : Structure de la table $CfgTablePhotos pour l'encodage de nouvelles photos dans une galerie
==> gallery_id = 1 photo_filename=image1.jpg
==> gallery_id = 1 photo_filename=image2.jpg
==> Etc ...

Jusqu'à présent, me suivez vous ?

Oui, Bon alors on continue :

Comme l'imbrication de deux boucles while est suspect et peu orthodoxe, je me suis penché vers la solution de jointure de table ... mais la encore je rencontre des problèmes. Le résultat obtenu n'est pas celui désiré
<?php
// On inclus le fichier de configuration
require_once ('.dirsys/conf/config.inc.php');

// Connection à la base de donnée
$db = mysql_connect($CfgServerHost, $CfgServerUser, $CfgServerPassword) or die('Error #1 : Could not connect to database');
mysql_select_db($CfgDatabase,$db) or die ('Error #2 : Cannot select database');

// Requete principale qui permet d'afficher le titre, la date, le compteur de hits
$req_main="SELECT * FROM $CfgTableMain INNER JOIN $CfgTablePhotos ON $CfgTablePhotos.gallery_id = $CfgTableMain.gallery_id ORDER BY gallery_date DESC";
$res_main=mysql_query($req_main) or die('Error #3 : Could not execute mysql query MAIN'); 

// Boucle while principale pour l'affichage des galeries avec leur titre, date, nombre de hits, ...
while ($row = mysql_fetch_array ($res_main)) {

// Affichage de la galerie
echo '<div id="galleryHome">
<div id="galleryHomeBorder">
 <div id="galleryHomeTools">
 <a href="index.html" target="_self"><img src="images/photo.png" /></a>
 <a href="index.html" target="_self"><img src="images/video.png" /></a>
 <p>Date: '.$row['gallery_date'].'<br />
   Vue: '.$row['gallery_count'].'</p>
 </div>
 <a href="details.html"><img class="galleryHomePicture1" src="photos/'.$row['photo_filename'].'" width="150" height="113"
 alt="Galerie 1" /></a><br />
<p class="galleryHomeTitle1"><a href="details.html">'.$row['gallery_titlefr'].'</a></p>
</div>
</div>';
}
?> 
La jointure de table effectuée ne m'affiche pas mes deux galeries créées dans la table $CfgTableMain ... MAIS 4 !! car le nombre d'enregistrements dans la table des photos ($CfgTablePhotos -portant la même ID que dans la table $CfgTableMain) est de 4.

Cette opération de jointure est donc incorrecte car, rappelons le je désire avoir le même résultat que dans mon premier code (celui avec les imbrications de boucles) mais un peu mieux codé.

Pouvez-vous me dire ce que je dois faire pour avoir le même résultat que dans mon méli-melot de boucles tout en ayant un beau code bien propre ?

Merci de votre aide,

Raph