Page 1 sur 1

afficher un tableau avec trie par colonne

Posté : 25 août 2007, 17:34
par t671
Bonjour,

J'ai une base de donnée qui comporte les champs "nom", "prénom" et "pupitre".
Je cherche à afficher un tableau par colonne en fonction de la valeur pupitre qui peut avoir 4 valeurs différentes (ténor, basse, alto ou soprane). Bien sûr, les nom et prénom seront dans la colonne du pupitre correspondant.

J'ai écrit ceci :
// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

$select_sop = 'SELECT nom_sop,prenom_sop FROM soprane';
$select_ten = 'SELECT nom_ten,prenom_ten FROM tenor';
$select_alt = 'SELECT nom_alt,prenom_alt FROM alto';
$select_bas = 'SELECT nom_bas,prenom_bas FROM basse';
$result_sop = mysql_query($select_sop,$link) or die ('Erreur : '.mysql_error() );
$result_ten = mysql_query($select_ten,$link) or die ('Erreur : '.mysql_error() );
$result_alt = mysql_query($select_alt,$link) or die ('Erreur : '.mysql_error() );
$result_bas = mysql_query($select_bas,$link) or die ('Erreur : '.mysql_error() );
$total_sop = mysql_num_rows($result_sop);
$total_ten = mysql_num_rows($result_ten);
$total_alt = mysql_num_rows($result_alt);
$total_bas = mysql_num_rows($result_bas);

{
    // début du tableau
    echo '<table bgcolor="#FFFFFF">';
    // première ligne on affiche les titres 
        echo '<tr bgcolor="#FFCC66" align="center">';
        echo '<td COLSPAN="2"><b><u>Soprane</u></b></td></tr>';
        	while($row = mysql_fetch_array($result_sop)) {
        echo '<tr bgcolor="#CCCCCC">';
        echo '<td>'.strtoupper($row['nom_sop']). '</td>';
        echo '<td>'.ucfirst($row['prenom_sop']).'</td>';
        echo '</tr>';
        }
	echo '<tr bgcolor="#FFCC66" align="center">';
	echo '<td COLSPAN="2"><b><u>Ténor</u></b></td></tr>';
		while($row = mysql_fetch_array($result_ten)) {
    	echo '<tr bgcolor="#CCCCCC">';
        echo '<td>'.strtoupper($row['nom_ten']).'</td>';
        echo '<td>'.ucfirst($row['prenom_ten']).'</td>';
        echo '</tr>';
		}
		
		echo '<tr bgcolor="#FFCC66" align="center">';
		echo '<th COLSPAN="2"><b><u>Alto</u></b></th></tr>';
		while($row = mysql_fetch_array($result_alt)) {
  		echo '<tr bgcolor="#CCCCCC">';
        echo '<td>'.strtoupper($row['nom_alt']).'</td>';
        echo '<td>'.ucfirst($row['prenom_alt']).'</td>';
        echo '</tr>';
  }

		
		echo '<tr bgcolor="#FFCC66" align="center">';
		echo '<th width=200 COLSPAN="2"><b><u>Basse</u></b></th></tr>';
        echo '</tr>';
        while($row = mysql_fetch_array($result_bas)) {
		echo '<tr bgcolor="#CCCCCC">';
        echo '<td>'.strtoupper($row['nom_bas']).'</td>';
        echo '<td>'.ucfirst($row['prenom_bas']).'</td>';
		echo '</tr>';
  }
}

// on libère le résultat
mysql_free_result($result_sop);
mysql_free_result($result_ten);
mysql_free_result($result_alt);
mysql_free_result($result_bas);
J'ai comme affichage tout sur une colonne. Le titre "soprane" avec les sopranes dessous; dessous le titre "ténor" avec les ténors dessous; dessous etc .....

Quelqu'un pourrait il m'aider ?

Merci

Posté : 25 août 2007, 18:58
par guillaume40
Ce que je te conseille c'est de faire en une seule table et ajouter une colone qui contiendra alto,alti et tout et normalement sa serai beaucoup plus facile

Posté : 25 août 2007, 19:37
par t671
Je comprend pas trop ce que tu veux me dire .....

Faire une seule table ? Ben j'en ai qu'une !!!!!! :?:

Posté : 26 août 2007, 11:12
par Ryle
Il ne parle pas de tableau html mais de table en base de données. Et tu en as actuellement 4 qui sont apparement scrupuleusement identiques : 'soprane' 'tenor' 'alto' et 'basse' sur lesquelles tu fais 4 select.

Le mieux serait donc de faire une seule table en base contenant tous les noms et prénoms, ainsi qu'une colonne pupitre (?) qui contiendrait la valeur 'soprane', 'tenor', etc.

Tu n'aurais alors qu'un seul SELECT à faire, tu pourrais facilement trier par nom ou par pupitre (ORDER BY), voire filtrer la liste pour n'afficher que les 'tenor' (WHERE) ...


Ceci, si j'ai bien compris ce que tu veux faire, c'est afficher les résultats sur 4 colonnes ? le plus simple pour cela, dans l'état actuel des choses, c'est simplement de faire un tableau de 4 colonnes et d'afficher dans chacune la liste correspondante :
<table>
  <tr>
    <th>Soprane</th>
    <th>Ténor</th>
    ...
  </tr>
  <tr>
    <td>
      <?php // affiche la liste des sopranes ?>
    </td>
    <td>
      <?php // affiche la liste des ténors ?>
    </td>
    ...
  </tr>
</table>

Posté : 26 août 2007, 13:42
par sadeq
Je préciserais:
<?php
   //Ici, le début de ton programme
   ...
?>
<table>
  <tr>
    <th>Soprane</th>
    <th>Ténor</th>
    ...
  </tr>
  <tr>
    <td>
         <table>
<?php 
         // affiche la liste des sopranes 
         while($row = mysql_fetch_array($result_sop)) {
        echo '<tr bgcolor="#CCCCCC">';
        echo '<td>'.strtoupper($row['nom_sop']). '</td>';
        echo '<td>'.ucfirst($row['prenom_sop']).'</td>';
        echo '</tr>';
        } 
?>
        </table>
    </td>
    <td>
        <table>
<?php 
      // affiche la liste des ténors 
      ....
?>
         </table>
    </td>
    ...
  </tr>
</table>
Donc, une table html principale qui cadre les colonnes et dans chaque colonne une sous table html pour présenter les noms et prénoms correspondant.

Posté : 26 août 2007, 15:55
par Ryle
Mouais... chuis pas fan des tableaux de tableaux html, surtout quand ceux-ci ne contiennent qu'une colonne.. :?
Il vaut mieux leur préférer une liste d'éléments, ou simplement insérer un <br> entre chaque que de coller des tables, des lignes et des cellules à tout va. Ca sera plus leger, plus lisible et plus facile à maintenir :)
<td bgcolor="#CCCCCC"> 
  <?php  
    // affiche la liste des sopranes  
    while($row = mysql_fetch_array($result_sop)) { 
        echo strtoupper($row['nom_sop']) .' '. ucfirst($row['prenom_sop']); 
        echo '<br />'; 
    }  
  ?> 
</td> 

Posté : 28 août 2007, 11:06
par t671
Aïe, aïe,aïe ..... Ca marche pô !!!!!!!

Je n'ai aucun résultat dans la méthode donnée !!!! Alors, j'ai modifié un peu le script.
Là, j'arrive à avoir mes colonnes "soprane, ténor, basse et alto" avec les éléments correspondants, mais le souci c'est que tout s'affiche sur une seule colonne. Et moi je voudrais afficher une colonne soprane, la colonne ténor à côté, la colonne alto encore à côté, et idem pour basse !
<?php 
// information pour la connection à le DB
$host = 
$user = 
$pass = 
$db = 

// connection à la DB
$link = mysql_connect ($host,$user,$pass) or die ('Erreur : '.mysql_error() );
mysql_select_db($db) or die ('Erreur :'.mysql_error());

	$select_sop = "SELECT * FROM chorale WHERE pupitre like 'soprane'";
	$select_ten = "SELECT * FROM chorale WHERE pupitre like 'tenor'";
	$select_alt = "SELECT * FROM chorale WHERE pupitre like 'alto'";
	$select_bas = "SELECT * FROM chorale WHERE pupitre like 'basse'";
	$result_sop = mysql_query($select_sop,$link) or die ('Erreur : '.mysql_error() );
	$result_ten = mysql_query($select_ten,$link) or die ('Erreur : '.mysql_error() );
	$result_alt = mysql_query($select_alt,$link) or die ('Erreur : '.mysql_error() );
	$result_bas = mysql_query($select_bas,$link) or die ('Erreur : '.mysql_error() );
	 
	{
	    // début du tableau
	    echo '<table>';
	    // première ligne on affiche les titres 
	        echo '<tr bgcolor="#FFCC66" align="center">';
	        echo '<th COLSPAN="2"><b><u>Soprane</u></b></th>';
			while($row = mysql_fetch_array($result_sop)) {
	        		echo '<tr bgcolor="#CCCCCC">';
	        		echo '<td>'.strtoupper($row['nom']).'</td>';
	        		echo '<td>'.$row['prenom'].'</td>';
	        		echo '</tr>';}
		echo '<tr bgcolor="#FFCC66" align="center">';
	        echo '<th COLSPAN="2"><b><u>Ténor</u></b></th>';
			while($row = mysql_fetch_array($result_ten)) {
	        		echo '<tr bgcolor="#CCCCCC">';
	        		echo '<td>'.strtoupper($row['nom']).'</td>';
	        		echo '<td>'.$row['prenom'].'</td>';
	        		echo '</tr>';}
		echo '<tr bgcolor="#FFCC66" align="center">';
	        echo '<th COLSPAN="2"><b><u>Alto</u></b></th>';
			while($row = mysql_fetch_array($result_alt)) {
	        		echo '<tr bgcolor="#CCCCCC">';
	        		echo '<td>'.strtoupper($row['nom']).'</td>';
	        		echo '<td>'.$row['prenom'].'</td>';
	        		echo '</tr>';}
		echo '<tr bgcolor="#FFCC66" align="center">';
	        echo '<th COLSPAN="2"><b><u>Basse</u></b></th>';
			while($row = mysql_fetch_array($result_bas)) {
	        		echo '<tr bgcolor="#CCCCCC">';
	        		echo '<td>'.strtoupper($row['nom']).'</td>';
	        		echo '<td>'.$row['prenom'].'</td>';
	        		echo '</tr>';}

	        echo '</tr></table>';
}

// on libère le résultat
mysql_free_result($result_sop);
mysql_free_result($result_ten);
mysql_free_result($result_alt);
mysql_free_result($result_bas);

?>
Merci :oops:

Posté : 28 août 2007, 11:14
par Ryle
Fais le à l'envers et pars du code que tu veux obtenir :)

Commence par faire un bête tableau avec une seule ligne et 4 cellules/colonnes.
Insère ensuite dans ta première cellule le code que tu veux y afficher, c'est à dire ta boucle qui affiche tout tes sopranes sous forme de liste ou de tableau (attention, le tableau à l'intérieur de la cellule doit être correctement constitué : balises <table></table>, les lignes <tr> et les cellules <td> doivent être correctement fermées, etc.)

Et puis une fois que c'est fait, tu fais de même dans tes trois autres colonnes, et le tour est joué ;)

Posté : 28 août 2007, 12:15
par t671
Effectivement, y'a du mieux ....
Mais par contre, les nom et prénom ne s'affichent pas sur une colonne, mais l'un à côté de l'autre ... :(
Comment lesfaire afficher en colonne ??? :?:
{
	    // début du tableau
	    echo '<table>';
	    
echo '<tr>';
	echo '<th COLSPAN="2">Sopranos</th>';
	echo '<th COLSPAN="2">Ténors</th>';
	echo '<th COLSPAN="2">Altos</th>';
	echo '<th COLSPAN="2">Basses</th>';
echo '</tr>';
echo '<tr>';
	while($row = mysql_fetch_array($result_sop)) {
	        echo '<td>'.strtoupper($row['nom']).'</td>';
	        echo '<td>'.$row['prenom'].'</td>'; }

	while($row = mysql_fetch_array($result_ten)) {
	        echo '<td>'.strtoupper($row['nom']).'</td>';
	        echo '<td>'.$row['prenom'].'</td>'; }

	while($row = mysql_fetch_array($result_alt)) {
	        echo '<td>'.strtoupper($row['nom']).'</td>';
	        echo '<td>'.$row['prenom'].'</td>'; }

	while($row = mysql_fetch_array($result_bas)) {
	        echo '<td>'.strtoupper($row['nom']).'</td>';
	        echo '<td>'.$row['prenom'].'</td>'; }
echo '</tr>';
echo '</table>';

	}
:?

Posté : 28 août 2007, 12:47
par sadeq
Tu reviens à ma solution finalement :lol: Une table principale qui contient 4 colonnes et dans chaque colonne une sous-table qui présente les noms/prénoms trouvés par les requêtes.
        // début du tableau 
        echo '<table>'; 
         
echo '<tr>'; 
    echo '<th COLSPAN="2">Sopranos</th>'; 
    echo '<th COLSPAN="2">Ténors</th>'; 
    echo '<th COLSPAN="2">Altos</th>'; 
    echo '<th COLSPAN="2">Basses</th>'; 
echo '</tr>'; 
echo '<tr>'; 

echo '<td>'; //contenu de la colonne Sopranos
echo "<table width='100%'>";
    while($row = mysql_fetch_array($result_sop)) { 
            echo '<tr><td>'.strtoupper($row['nom']).'</td>'; 
            echo '<td>'.$row['prenom'].'</td></tr>'; } 
echo '</table></td>';

echo '<td>'; //contenu de la colonne Ténors
echo "<table width='100%'>";
    while($row = mysql_fetch_array($result_ten)) { 
            echo '<tr><td>'.strtoupper($row['nom']).'</td>'; 
            echo '<td>'.$row['prenom'].'</td></tr>'; } 
echo '</table></td>';

echo '<td>'; //contenu de la colonne Altos
echo "<table width='100%'>";
    while($row = mysql_fetch_array($result_alt)) { 
            echo '<tr><td>'.strtoupper($row['nom']).'</td>'; 
            echo '<td>'.$row['prenom'].'</td></tr>'; } 
echo '</table></td>';

echo '<td>'; //contenu de la colonne Basses
echo "<table width='100%'>";
    while($row = mysql_fetch_array($result_bas)) { 
            echo '<td>'.strtoupper($row['nom']).'</td>'; 
            echo '<td>'.$row['prenom'].'</td>'; } 
echo '</table></td>';

echo '</tr>'; 
echo '</table>';
ps: Pour Ryle je précise: Les sous-tables dans cette solution ne font qu'aligner la présentation des données. Et ce n'est qu'une suggestion.

Posté : 28 août 2007, 13:39
par Ryle
@sadeq : voui voui, mais ça fait quand même des tableaux de tableaux, et c'est un peu lourd selon moi juste pour une liste de noms, même s'ils sont mieux alignés ;)

Posté : 29 août 2007, 09:59
par t671
Merci beaucoup sadeq !!!!!! Ca marche ........... :D :P !!!!!

J'ai pensé à une autre solution : serait-il possible d'arriver au même résultat en faisant un test sur le contenu du champs "pupitre", et de changer de colonne quand le contenu du champs change ????

Cela permettrait d'alléger le script .....

Mais je sais pas trop comment faire ...... ??? :?:

Posté : 29 août 2007, 11:00
par Ryle
Tu peux effectivement ne faire qu'une seule requête pour récupérer toutes tes données en base et utiliser un tableau pour répartir les données correctement et ainsi juste avoir à les afficher ensuite :)

Il y a de nombreuses façon de faire, en voici une :
<?php
$select = "SELECT nom, prenom, pupitre FROM chorale"; 
$result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() ); 

$tabPupitre = array(); // tableau qui contiendra les différents pupitres et les noms associés 
while($row = mysql_fetch_array($result)) { 
  // pour chaque enregistrement retourné, on prépare la chaine qui sera affichée
  $str = '<tr>'; 
  $str.= '<td>'.strtoupper($row['nom']).'</td>'; 
  $str.= '<td>'.$row['prenom'].'</td>'; 
  $str.= '</tr>';

  // puis on ajoute cette chaine dans le tableau, à la suite, pour le pupitre correspondant 
  $tabPupitre[$row['pupitre']] .= $str; 

} 

// si tu veux vérifier le contenu du tableau :
// echo '<pre>'; print_r($tabPupitre); echo '</pre>';

mysql_free_result($result); 

// il ne reste plus qu'à afficher le contenu de chaque champ du tableau php au bon endroit dans le tableau html :
?>

<table>
  <tr bgcolor="#FFCC66" align="center">
    <th><u>Soprane</u></th>
    <th><u>Ténors</u></th>
    <th><u>Altos</u></th>
    <th><u>Basses</u></th>
  </tr>
  <tr>
    <td><table><?php echo $tabPupitre['soprane']; ?></table></td>
    <td><table><?php echo $tabPupitre['tenor']; ?></table></td>
    <td><table><?php echo $tabPupitre['alto']; ?></table></td>
    <td><table><?php echo $tabPupitre['basse']; ?></table></td>
  </tr>
</table>

Posté : 29 août 2007, 11:29
par t671
Merciiiiiiiiiiiii !!!! C'est génial !!!!!! :P :D :lol:

Et à vous tous !!!!!!! :wink: