afficher un select de plusieurs tables en un seul resultat

Petit nouveau ! | 9 Messages

18 oct. 2005, 01:24

Salut !

je galère depuis deux jours sur un petit bout de code...
je poste ici, car je pense que ce n'est pas un problème au niveau de la requète sql... mais sait_on jamais ! :roll:

J'ai une base de donnée prog_fin2005 qui contient deux tables.
La table groupe(id_groupe, soiree_id, nom_groupe), et la table soiree(id_soiree, date).

Le but de ma requête est d'afficher une ligne par soiree, avec le ou les groupe sous chaque soiree.

Tout va bien sauf pour l'affichage des groupes qui ont le même soiree_id.

Mon code actuel :
<?php
// inclusion de la fonction date_fr()
include('include/conversion_date.inc.php');

// inclusion des parametres de connexion
require_once('secret/sql_connect.inc.php');

//selection de toutes les soirees
$query = '	SELECT soiree.id_soiree, soiree.date, groupe.nom_groupe 
		FROM soiree, groupe
		WHERE soiree.id_soiree = groupe.soiree_id
		ORDER BY date
		ASC'; 
$result = mysql_query($query,$link) or die("<br>query failed".mysql_error());

//test des resultats
if($result!==0)
{
	// construction du tableau de sortie
	while($soiree = mysql_fetch_assoc($result))
	{
		echo '<table width="680" style="margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
				<tr align="left" bgcolor="#ff6633">
					<td colspan="2"><b><font color="white">'.date_fr($soiree['date']).'</font></b></td></tr>
				<tr>
					<td align="left"><font color="#cc5522">'.$soiree['nom_groupe'].'<b></font></td>
					<td align="right"><a href="soiree.php?id_soiree='.$soiree['id_soiree'].' ">En Savoir plus...</a></td></tr>
			</table>
			<br><br>';//fin du echo de construction
		
	}
}
else
{
	echo 'pas de resultat';
}
Avec ce code, au lieu d'avoir une soiree avec deux groupes, j'ai deux soirees avec un groupe chacune... :cry:

je me demande si c'est ma requête sql qui est mal construite (est-ce que je dois faire deux requêtes : une pour afficher les soirees, et une pour les groupes ?),
ou si je m'y prend très mal pour lire le tableau $soiree... :?:

Si quelqu'un peut m'aiguiller... Merci ! :wink:

Petit nouveau ! | 6 Messages

18 oct. 2005, 08:07

Je pense qu'il te faut faire deux requêtes :

La premiere va selectionner tous les champs de la tables 'soiree'

puis pour chaque 'id_soiree' de cette requete tu fais une autre requête sur la table 'groupe'
<?php
$sql1 = mysql_query("SELECT * FROM soiree ORDER BY date") 
or die('Requete impossible');

while ($table1 = mysql_fetch_array($sql1)) {

$id_soiree = $table1['id_soiree'];

$sql2 = mysql_query ("SELECT * FROM groupe WHERE id_soiree = '$id_soiree' ")
or die ('Requete 2 impossible');

echo '
<table width="680" style="margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="2">
                <tr align="left" bgcolor="#ff6633">
                    <td colspan="2"><b><font color="white">'.date_fr($table1['date']).'</font></b></td></tr>'

while ($table2 = mysql_fetch_array($sql2)) {

echo '
<tr>
                    <td align="left"><font color="#cc5522">'.$table2['nom_groupe'].'<b></font></td>
                    <td align="right"><a href="soiree.php?id_soiree='.$table1['id_soiree'].' ">En Savoir plus...</a></td></tr>'

}
echo '<table>'

}
?>



ViPHP
ViPHP | 2144 Messages

18 oct. 2005, 09:04

Tu peux très bien le faire en une seule requête, tu vas en effet récuperer une ligne ppour chaquesgroupes d'une soirée.
Mais en faisant un test, tu n'affiches la soirée que si la soirée est différente de la précédente.

en gros en pseudo code, ça devraut ressembler à ceci:

Code : Tout sélectionner

$soireePrec =""; while (...){ // si la soirée precédente est différente de l'actuelle, on affiche ses infos if ($soireePrec != $soiree['date'] ) print $soiree['date']; // // Le reste de l'affichage concernant le groupe // // mise à jour de soirée prec sur la soirée courante $soireePrec = $soiree['date']; }
Modifié en dernier par iclo le 18 oct. 2005, 09:05, modifié 1 fois.

ViPHP
pjl
ViPHP | 2119 Messages

18 oct. 2005, 09:04

et une soirée par jour, à la fin de l'année, ca fait une requête pour l'ensemble des soirées et 365 requêtes pour trouver les groupes. :roll:
Il ne faut pas vous mettre sur un hébergeur partagé. Je plains vos voisins.

La requête de dogawaf est tout à fait correcte.

Ensuite, c'est simplement une question de mise en page et là, c'est au PHP de jouer.

dogawaf dit lui même :
Tout va bien sauf pour l'affichage des groupes qui ont le même soiree_id.
Il suffit donc de mettre une condition. Si c'est le même soirée_id, je fais celà sinon, je fais ceci.

Invité
Invité n'ayant pas de compte PHPfrance

18 oct. 2005, 11:25

Ensuite, c'est simplement une question de mise en page et là, c'est au PHP de jouer.

dogawaf dit lui même :
Tout va bien sauf pour l'affichage des groupes qui ont le même soiree_id.
Il suffit donc de mettre une condition. Si c'est le même soirée_id, je fais celà sinon, je fais ceci.
ben oui, c'est ça.
parce que quand je fait un print_r($soiree); j'ai tous les résulats qu'il me faut.
le truc c'est de savoir si c'est possible de lire un tableau avec une condition.

du genre : si dans mon tableau $soiree il y a plusieurs groupe avec le même soiree_id, alors affiche. et sinon, passe à la soiree suivante.

ViPHP
pjl
ViPHP | 2119 Messages

18 oct. 2005, 11:28

maintenant que c'est écrit clairement, il te reste à le coder en PHP.

Petit nouveau ! | 9 Messages

18 oct. 2005, 11:37

arf... c'est la dessus que je bloque.

je ne vois pas comment faire une recherche dans un tableau...
il y a in_array() etc... mais je pense qu'il y a une solution plus simple.

c'est sur ce point que je demande de l'aide :oops:

ViPHP
pjl
ViPHP | 2119 Messages

18 oct. 2005, 11:46

ce n'est pas une recherche, c'est une condition pour gérer l'affichage.

C'est bien ce que tu as écris ici :
si dans mon tableau $soiree il y a plusieurs groupe avec le même soiree_id, alors affiche. et sinon, passe à la soiree suivante.
http://fr2.php.net/manual/fr/language.c ... ctures.php

Petit nouveau ! | 9 Messages

18 oct. 2005, 12:00

si dans mon tableau $soiree il y a plusieurs groupe avec le même soiree_id, alors affiche.
ça parait con, mais c'est cette condition que je n'arrive pas à interpreter en code.

Petit nouveau ! | 9 Messages

18 oct. 2005, 14:53

pjl, merci pour le lien sur les structures conditionnelles de php.net :D
mais j'ai déjà passé pas mal de temps à étudier tout ça, y compris sur la doc officilelle php et mysql. :wink:

ce qu'il me manque, c'est le petit bout de code qui me ferait piger tout ça. :?

j'arrive pas à capter s'il faut que j'intègre le résultat dans une boucle, ou si je doit faire une boucle avec une conditions, ou si je dois faire plusieurs requete.

merci

ViPHP
pjl
ViPHP | 2119 Messages

18 oct. 2005, 15:31

une seule requête comme il a été dit ensuite :
tu initialise

Code : Tout sélectionner

identifiant = 0
ensuite dans ta boucle qui exploite le résultat de ta requête :

Code : Tout sélectionner

si id_soirée <> identifiant j'affiche soirée fin condition affiche groupe identifiant = id_soirée

Petit nouveau ! | 9 Messages

18 oct. 2005, 22:32

bon, maintenant ça marche. Mais j'ai l'impression que c'est du bidouillage...

en effet, j'ai dû remanier la forme de mon tableau, placer les sauts de ligne à d'autres endroits...

mais bon, ça marche, c'est le principal !! :D
à force de chercher et de bidouiller, je comprends tout juste ce que je viens de coder :oops:

merci jdl et les autres.

// inclusion de la fonction date_fr()
include('include/conversion_date.inc.php');

// inclusion des parametres de connexion
require_once('secret/sql_connect.inc.php');

//selection de toutes les soirees
$query = '	SELECT soiree.id_soiree, soiree.date, groupe.nom_groupe , groupe.soiree_id
		FROM soiree, groupe
		WHERE soiree.id_soiree = groupe.soiree_id
		ORDER BY date
		ASC'; 
$result = mysql_query($query,$link) or die("<br>query failed".mysql_error());

//test des resultats
if($result!==0)
{
	$identifiant = 0;
	
	// construction du tableau de sortie
	while($soiree = mysql_fetch_assoc($result))
	{
		if($soiree['id_soiree'] != $identifiant)
		{
			echo '<br><br>';
			echo '<table width="680" style="margin-left: auto; margin-right: auto;" border="0" cellpadding="2" cellspacing="0">
					<tr bgcolor="#ff6633">
						<td align="left"><b><font color="white">'.date_fr($soiree['date']).'</font></b></td>
						<td align="right"><a href="soiree.php?id_soiree='.$soiree['id_soiree'].' ">En Savoir plus...</a></td></tr></table>';
		}		
			
		echo '<table align="center"><tr><td align="center"><font color="#cc5522"><b>'.$soiree['nom_groupe'].'</b><font></td></tr></table>';
		$identifiant = $soiree['id_soiree'];
	}
}
else
{
	echo 'pas de resultat';
}


ViPHP
pjl
ViPHP | 2119 Messages

19 oct. 2005, 09:21

C'est bon.
Tout est OK et c'est toi qui a écrit ton code.
Un petit résolu ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 oct. 2005, 09:41

merci jdl
il m'est arrivé de t'appeller jpl mais jamais jdl :langue:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Petit nouveau ! | 9 Messages

19 oct. 2005, 10:51

merci jdl
il m'est arrivé de t'appeller jpl mais jamais jdl :langue:
:oops: ah ah désolé pjl...
et merci !