Afficher éléments par catégories

diabolorange
Invité n'ayant pas de compte PHPfrance

13 nov. 2007, 23:33

Bonjour,
Je veux afficher le nom d'une categorie puis les élements qui leurs sont associées. Seulement quand j'éxecute la requête, cela affiche l'ensemble des résultats en omettant toujours le premier. (Donc il me manque le premier élement de chaque catégorie.)
Voici mon code:
<?
include ('cnx.php');
$select = 'SELECT * FROM matable';
$result = mysql_query($select,$connexion)  or die ('Erreur : '.mysql_error() );
$categ='';
while ($row = mysql_fetch_array($result)){
	if ($serie != $row['categorie']){
		echo "</table>\n";
?>
<table>
  <tr>
	<td width="150"><img src="images/<? echo $row['image']; ?>"></td>
	<td><? echo $row['categorie']; ?></td>
  </tr>
</table>
<table>
  <tr>
    <td>colonne1</td>
    <td>colonne2</td>
    <td>colonne3</td>
    <td>colonne4</td>
    <td>colonne5</td>
  </tr>
<?
 	}else{
		echo "<tr>\n";
		echo "<td>".$row['colonne1']."</td>\n";
		echo "<td>".$row['colonne2']."</td>\n";
		echo "<td>".$row['colonne3']."</td>\n";
		echo "<td>".$row['colonne4']."</td>\n";
		echo "<td>".$row['colonne5']."</td>\n";
		echo "</tr>\n";
	}
$categ = $row['categorie'];
}
?>
Comment afficher tous les élements de chaque categorie?:roll:
Le code est un peu chaotique, je l'avoue mais c'est encore en construction.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

13 nov. 2007, 23:53

Modération :
diabolorange, si tu as une autre question ouvre un nouveau sujet,
cela te permettra d'avoir plus de réponses.

En plus, tu pourras mettre [Résolu] dès que ton problème évoqué ici sera réglé.

Merci de prendre le temps de lire les règlements.
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

Eléphant du PHP | 445 Messages

14 nov. 2007, 00:00

Il faudrait que tu regardes au code source que ta page renvoie.

Tu crée un nouveau tableau a chaque entrée de ta table.

<table> dans un while(mysql_fetch_assoc(....))

diabolorange
Invité n'ayant pas de compte PHPfrance

14 nov. 2007, 00:22

Modération :
diabolorange, si tu as une autre question ouvre un nouveau sujet,
cela te permettra d'avoir plus de réponses.

En plus, tu pourras mettre [Résolu] dès que ton problème évoqué ici sera réglé.

Merci de prendre le temps de lire les règlements.
Par soucis de sujet trop nombreux à lire, blablaba, j'ai posté dans un sujet déjà existant.
Merci d'avoir ouvert un nouveau sujet.

Invité
Invité n'ayant pas de compte PHPfrance

14 nov. 2007, 00:40

Il faudrait que tu regardes au code source que ta page renvoie.

Tu crée un nouveau tableau a chaque entrée de ta table.

<table> dans un while(mysql_fetch_assoc(....))
En fait, je ferme un tableau au début de ma page, ce qui n'est pas très propre en effet (j'avais po vu ça) mais n'empêche normalement pas l'affichage au complet de ma requête. Chose qui se fait très bien sans l'ajout de la condition.
Est-ce que un foreach pourrait résoudre le problème ou est-ce une idée délirante?
Un isset($serie) ne fonctionne evidemment pas (j'ai verifié quand même 8-|).
Le problème est donc de ne pas faire de vérification lors du premier passage. Ce qui necéssite, je crois, un profond remaniement de l'ensemble.
J'ai bon?

diabolorange
Invité n'ayant pas de compte PHPfrance

14 nov. 2007, 23:07

Toujours dans un esprit aussi brut, j'ai UNE solution pour un affichage correct. Lors du premier passage while, on realise quand même la condition if, la fin du tableau (html) ne peut donc pas s'afficher et on repart du while. En répetant le même bout de code hors du if, cela permet d'afficher le premier résultat.
Voici donc le code qui affichera l'ensemble des résultats:
<?
include ('cnx.php');
$select = 'SELECT * FROM matable';
$result = mysql_query($select,$connexion)  or die ('Erreur : '.mysql_error() );
$categ='';
echo "<table>";
while ($row = mysql_fetch_assoc($result)){
	if ($categ != $row['categorie']){
		echo "</table>\n";
?>
<table>
  <tr>
	<td width="150"><img src="images/<? echo $row['image']; ?>"></td>
	<td><? echo $row['categorie']; ?></td>
  </tr>
</table>
<table>
  <tr>
    <td>colonne1</td>
    <td>colonne2</td>
    <td>colonne3</td>
    <td>colonne4</td>
    <td>colonne5</td>
  </tr>
<?
		echo "<tr>\n";
		echo "<td>".$row['colonne1']."</td>\n";
		echo "<td>".$row['colonne2']."</td>\n";
		echo "<td>".$row['colonne3']."</td>\n";
		echo "<td>".$row['colonne4']."</td>\n";
		echo "<td>".$row['colonne5']."<br>ISBN:".$row['isbn']."</td>\n";
		echo "</tr>\n";
$categ = $row['categorie'];
 	}else{
		echo "<tr>\n";
		echo "<td>".$row['colonne1']."</td>\n";
		echo "<td>".$row['colonne2']."</td>\n";
		echo "<td>".$row['colonne3']."</td>\n";
		echo "<td>".$row['colonne4']."</td>\n";
		echo "<td>".$row['colonne5']."<br>ISBN:".$row['isbn']."</td>\n";
		echo "</tr>\n";
	}
$categ = $row['categorie'];
}
?>
Ok c'est franchement dégeu comme code mais ça marche. Reste à passer un serieux coup de balai.
(chui un peu tout seul là non? :-s )
La table comporte 8 champs
1 champ 'id'
1 champ 'categorie'
1 champ 'image'
5 champs colonne (respectivement 1, 2, 3, 4, 5)
Merci à tout ceux qui m'aideront pour le ménage.

ViPHP
AB
ViPHP | 5818 Messages

15 nov. 2007, 02:16

A ta place je ferais une table pour les catégories et une autre pour les éléments des catégories. C'est habituellement de cette façon que l'on procède.

diabolorange
Invité n'ayant pas de compte PHPfrance

15 nov. 2007, 11:45

A ta place je ferais une table pour les catégories et une autre pour les éléments des catégories. C'est habituellement de cette façon que l'on procède.
Ca ne réduirai pas le nombre de lignes du code ni la répetition de celui-ci au niveau du else.

diabolorange
Invité n'ayant pas de compte PHPfrance

16 nov. 2007, 15:54

Par contre ça ferai déjà un peu de ménage.

diabolorange
Invité n'ayant pas de compte PHPfrance

03 déc. 2007, 20:11

Cette solution permet un affichage propre sans répetition de code et de conditions inutiles.
<?
include ('cnx.php');
$select = 'SELECT * FROM matable';
$result = mysql_query($select,$connexion)  or die ('Erreur : '.mysql_error() );
// liste les elements qui ne seront afficher qu'une fois
$tab = array();
$i=0;
while ($row = mysql_fetch_assoc($result)){
	$tab['categorie'][$i] = $row['categorie'];
	$i++;
}
$categorie = array_unique($tab['categorie']);
$categorie = array_merge($categorie);
// toutes les categories se trouve dans $categorie avec cle de 0 à $i
$j=0;
$k=0;
//liste
for ($j=0;$j<count($categorie);$j++){
	echo '<table>\n';
	echo '<tr>\n';
	echo '<td>'.$categorie[$j].'</td>\n';
	echo ' </tr>\n';
	echo '<tr>\n';
	echo '<td><img src="images/'.$image[$j].'"></td>\n';
	echo '</tr>\n';
	echo '</table>\n';
	// recale le curseur mysql
	mysql_data_seek($result, $k);
	//On associe aux resultats de la requête les tableaux qui ne sont affichés qu'une fois avec l'operateur AND
	while ($row = mysql_fetch_assoc($result) AND $categorie[$j] == $row['categorie']){
		echo "<table>\n";
		echo "<tr>\n";
		echo "<td>".$row['colonne1']."</td>\n";
		echo "<td>".$row['colonne2']."</td>\n";
		echo "<td>".$row['colonne3']."</td>\n";
		echo "<td>".$row['colonne4']."</td>\n";
		echo "<td>".$row['colonne5']."</td>\n";
		echo "</tr>\n";
		echo "</table>\n";
		$k++;
	}
}
?>
Le but était de pouvoir tout afficher depuis une table unique et avec une seule requête.
Mis du temps |*() ...