probleme de tri de la base de donnée (colonne)

probleme de tri de la base de donnée (colonne) - PHP - Programmation

Marsh Posté le 13-11-2007 à 14:18:43    

Bonjour,
 
Je veux afficher le contenu de ma base de donnée mais le premier élement de chaque categorie est manquant. C'est une collection de livres dont certaines categories sont identiques. Je fais un tri de mes categories avec ma requete puis affiches les infos relatives à chacune d'entre elle.
Voici le code:

<?
include ('cnx.php');
$select = 'SELECT * FROM tbd ORDER BY categorie';
$result = mysql_query($select,$connexion)  or die ('Erreur : '.mysql_error() );
$categ='';
while ($row = mysql_fetch_array($result)){// chaque fois qu'il y a un resultat dans le tableau il est egal à $row
 if ($categ != $row['categorie']){
?>

<table width="1000" border="1">
  <tr>
   <td width="150"><img src="images/illustrations/<? echo $row['image']; ?>"></td>
    <td><? echo $row['categorie']; ?></td>
  </tr>
</table>
<table width="1000" border="1">
  <tr>
    <td>Edition:<? echo $row['edition']; ?></td>
 <td>Sc&eacute;nario:<? echo $row['scenario']; ?></td>
    <td>Dessin:<? echo $row['dessin']; ?></td>
  </tr>
</table>
<table width="1000" border="1">
  <tr>
    <td>Tome</td>
    <td>N&deg;</td>
    <td>Parution</td>
    <td>1&egrave;re Parution</td>
    <td>Commentaire</td>
  </tr>
<?
 }else{
  echo "<tr>";
  echo "<td>".$row['t_tome']."</td>";
  echo "<td>".$row['n_tome']."</td>";
  echo "<td>".$row['an_paru']."</td>";
  echo "<td>".$row['an_1er_paru']."</td>";
  echo "<td>".$row['commentaire']."<br>ISBN:".$row['isbn']."</td>";
  echo "</tr>";
 }
$categ = $row['categorie'];
}
?>

</table>
 
Pourquoi le premier élement manque a chaque fois? :heink:  
Je pense que c'est dû au "if" et au fait d'attribuer une valeur à $categ en fin de la boucle "while". Il doit exister une methode avec "for" je pense.
Merci de votre aide.

Reply

Marsh Posté le 13-11-2007 à 14:18:43   

Reply

Marsh Posté le 13-11-2007 à 14:33:15    

vire ton else, il ne sert à rien.
Mets son contenu juste après le if.

Reply

Marsh Posté le 13-11-2007 à 17:23:41    

Game over!
Si je place le contenu du else juste après if, il ne m'affiche que le second enregistrement de chaque categorie. Le but est de pouvoir afficher une fois la categorie et son image puis les livres qui y correspondent. Si une nouvelle categorie est à afficher on refait un  nouveau tableau avec la nouvelle categorie puis la nouvelle image puis les livres qui s'y rattachent etc...
E ici on ecrit les <td> et les <tr> en dehors du tableau.

Reply

Marsh Posté le 13-11-2007 à 17:31:19    

tu fais tellement n'importe quoi que c'est impossible de s'y retrouver.
Je maintiens néanmoins que le else n'a strictement aucune raison d'être là.

Reply

Marsh Posté le 13-11-2007 à 17:34:59    

bon bah je vais me debrouiller alors...
Et encore merci pour ton aide.

Reply

Marsh Posté le 13-11-2007 à 19:34:16    

As-tu exécuté ta requête directement dans la base de données ?
Est-ce que le premier élément n'a pas une catégorie vide, par hasard, ce qui ferait afficher une ligne (comme dit dans le "else" ) en dehors de tout tableau, donc le navigateur ne la reconnaitrait pas ...
 
en d'autres termes, à quoi ressemble le code généré ?


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 13-11-2007 à 23:10:48    

NewsletTux a écrit :

As-tu exécuté ta requête directement dans la base de données ?
Est-ce que le premier élément n'a pas une catégorie vide, par hasard, ce qui ferait afficher une ligne (comme dit dans le "else" ) en dehors de tout tableau, donc le navigateur ne la reconnaitrait pas ...
 
en d'autres termes, à quoi ressemble le code généré ?


 
La requête a été executé directement dans la base de donnée et celle-ci ne contient aucun champ vide (facile à vérifier, seulement une dizaine d'enregistrement pour le moment). J'ai simplifié le code pour le rendre plus lisible:
 
 
<?
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'];
}
?>

 
 
Le code généré ne contient aucune balise vide ou fermeture de <table> incorrect.

Reply

Marsh Posté le 13-11-2007 à 23:17:21    

Après seconde verif, le code source commence effectivement par un </table> d'où une erreur peut survenir effectivement.

Reply

Marsh Posté le 13-11-2007 à 23:27:20    

à quoi correspond $serie dans :
 if ($serie != $row['categorie']){  
 
 
PS : je parlais bien du code source final généré dans le navigateur, pas du PHP à l'origine.


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 14-11-2007 à 14:02:49    

erreur de ma part lors de la recopie il faut lire:
if ($categ != $row['categorie']){  
La table est simple à gérer, 7 champs:
1 chp "categorie"
1 chp "image"
5 champs "colonnes" nommés respectivement 1, 2, 3, 4, 5
elle comporte une dizaine d'enregistrement, seul le premier de chaque categorie ne s'affiche pas quand on la liste avec le code ci-dessus.
PS: Je parlais bien aussi du code source généré au final par le navigateur.
J'ai rajouté un echo "<table>" avent le 'while' ça fait pas très propre mais au moins chaque tableau se trouve ouvert et fermé.
Ici le code HTML n'a pas ou que peu d'incidence sur le traitement des données.

Reply

Marsh Posté le 14-11-2007 à 14:02:49   

Reply

Marsh Posté le 14-11-2007 à 16:50:05    

juste après  
while ($row = mysql_fetch_array($result)){  
rajoute
print_r($row); exit();
 
ça ne te mettra aucune table, ça va juste imprimer le contenu de la première ligne et bloquer le script. Tu sauras ce qu'elle vaut exactement. (pense à regarder le résultat du print_r dans le code source)


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Marsh Posté le 14-11-2007 à 22:18:32    

NewsletTux a écrit :

juste après  
while ($row = mysql_fetch_array($result)){  
rajoute
print_r($row); exit();
 
ça ne te mettra aucune table, ça va juste imprimer le contenu de la première ligne et bloquer le script. Tu sauras ce qu'elle vaut exactement. (pense à regarder le résultat du print_r dans le code source)


 
j'ai UNE solution pour un affichage correct (elle vaut ce qu'elle vaut). 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'];
}
?>

 
[:anathema] C'est dégeu comme code mais ça marche en attendant mieux.  :ange:  

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed