Soucis avec modulo

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 : Soucis avec modulo

par Cobra52 » 06 nov. 2006, 12:31

C'est bon !

J'ai réduit à 1 seule requête sql en rajoutant un champ "parent" à la table produits. Et là, j'ai bien l'affichage ordonné par "votes" :D

Il faut simplement que je modifie le formulaire où je rentre mes produits pour lui rajouter ce champ supplémentaire.

Merci :wink:

par zeus » 06 nov. 2006, 11:25

Bah ... :?

Tu doit mettres le champs du ORDER BY dans le SELECT de la même requete ...

Mais si ce champs n'est pas dans une des tables de la requetes, tu ne pourras l'utiliser dans le ORDER BY :-k

par Cobra52 » 06 nov. 2006, 10:51

Il me semble qu'il faut que le champ que tu mets dans le ORDER BY doit être dans le SELECT pour que ça fonctionne correctement :-k

A vérifier
Quel SELECT ? Le premier ?

Si c'est le cas, je suis mal, car le champ "votes" n'est pas dans la même table ! :roll:
Donc je ne pourrai pas ordonner mes résultats, comme je le souhaite.

par zeus » 06 nov. 2006, 10:46

Il me semble qu'il faut que le champ que tu mets dans le ORDER BY doit être dans le SELECT pour que ça fonctionne correctement :-k

A vérifier

par Cobra52 » 06 nov. 2006, 09:52

Bonjour à tous,

J'ai un petit soucis avec l'ordre d'affichage.

Dans mon second SELECT, je veux ordonner les résultats par "ORDER BY votes DESC". Mais l'affichage se fait par les "catID" du premier SELECT.

Voici le code :
$q = "SELECT catID FROM categories WHERE parent = '$catID' ";
	$r = mysql_query($q) or die(mysql_error());
	$compteur = 0;
	while ($row = mysql_fetch_array($r))
	{
		
		$sql_prod = "SELECT prodID, catID, name FROM produits WHERE catID = '" .$row['catID']. "' ORDER BY votes DESC";
		$result_prod = mysql_query($sql_prod) or die(mysql_error());
		while ($row2 = mysql_fetch_array($result_prod))
		{
			/* Si on est à la première de 2 photos, on crée la nouvelle ligne */ 	
			if ($compteur % 2 == 0)
			{
Est-il possible de forcer l'ordre d'affichage en fonction du "ORDER BY votes DESC" ?

Merci pour votre aide.

par Cobra52 » 25 sept. 2006, 17:53

Oui effectivement, tu as raison ( bon ça c'est normal aussi :lol: )

J'ai donc concervé $compteur
C'est nickel, il ne me reste plus qu'à mettre tout cela en forme.

Merci pour tout. :wink:

par Ryle » 25 sept. 2006, 16:37

Y a pas de quoi :)

Pour le $reste, pour que ce soit cohérent, il faut que la valeur que tu testes soit égale au nombre total d'élément affiché (pour savoir combien de colonne ont été remplies et combien il faudrait éventuellement en rajouter)

Dans ton dernier code, $nb correspondait uniquement au nombre d'éléments de la dernière catégorie (affiche les deux, tu devrais voir la différence :)). Ca peu tomber juste mais ça n'a rien d'une certitude. En fait, il te faudrait cumuler les $nb de chaque catID pour obtenir le total.
C'est ce que tu fais en sortant le $compteur=0 de ta boucle, puisqu'il va s'incrémenter à chaque nouvelle cellule affichée, et ainsi au final te dire combien tu en avais :)

par Cobra52 » 25 sept. 2006, 16:30

Merci Ryle :D

Je ne croyais jamais y arriver, ça fonctionne très bien. Que j'ai un résultat pair ou impair.

Une chose, j'ai modifier $nb par $compteur, mais ça ne change rien à l'affichage, ça fonctionne bien avec les 2. Mais je vais rester avec $compteur, comme tu me l'as indiqué :wink:

Merci pour tout, franchement :merci:

par Ryle » 25 sept. 2006, 16:21

Tes   en trop viennent du fait qu'il termine les lignes incomplètes avant de passer au prochain catID...

Sort la partie $reste et la boucle for() de ton while pour qu'il ne s'exécute qu'une fois que tu as lu tous tes éléments. Il ne devrait ainsi compléter que la dernière ligne :)

Sort également ton $compteur=0 de ton premier while, sans quoi à chaque $catID il reviendra à zéro, et à priori, ce qui t'interesse c'est qu'il te comptabilise tous les éléments quel que soit le $catID.

Enfin, dans ton calcul de $reste, ce n'est pas $nb qu'il te faut utiliser (qui ne comptabilise que le nombre de catID) mais le $compteur final qui t'indiquera combien d'éléments ont déjà été affiché :)

par Cobra52 » 25 sept. 2006, 15:34

Qu'est ce qui ne va pas ?

d'après le code que tu montres, on peut supposer que tu as :
- 2 éléments pour le premier idCat
- 1 élément pour le deuxième (complété d'un espace)
- 2 pour le troisième,
- 1 pour le quatrième (complété d'un espace)
- et 4 pour le dernier...

Le code correspond donc à priori bien à ce que tu souhaites, à savoir toutes tes données sur 2 colonnes :)
Ah ben voila d'où vient mon problème !!!!

Donc, comment faire pour ranger l'ensemble des éléments sur 2 colonnes ?

par Cobra52 » 25 sept. 2006, 14:20

Bon, j'ai encore modifier le php
$q = "SELECT catID FROM categories WHERE parent = '$catID'";   
   $r = mysql_query($q);   
   while ($row = mysql_fetch_array($r))   
   { 
echo "<table width="90%" border="0" cellspacing="0" cellpadding="0">";   
      $sql_prod = "SELECT nom FROM produits WHERE catID = '" .$row['catID']. "'";   
      $result_prod = mysql_query($sql_prod);   
      $nb = mysql_num_rows($result_prod);   
      $compteur = 0;   
      while ($row = mysql_fetch_array($result_prod))   
      { 
/* Si on est à la première de 2 photos, on crée la nouvelle ligne */          
         if ($compteur % 2 == 0)   
         {   
            echo "<tr>";   
         }   
         echo "<td>" .$row['nom']. "</td>";   
/* Si on est à la dernière d'une série de 2 photos, on ferme la ligne */                            
         if (($compteur + 1) % 2 == 0)   
         {   
            echo "</tr>";   
         }   
         $compteur++;   
       } 
/* Sinon, on comlpète avec des cellules vides avant de fermer le tableau */   
       $reste = ($nb % 2);   
       for($j = 0; $j < $reste; $j++)   
       {   
            echo "<td>&nbsp;</td>"; 
            echo "</tr>";  
       }   
            echo "</tr>";   
            
          
   }
echo "</table>";   
Ce qui donne :

Code : Tout sélectionner

<table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element1</td> <td>element2</td> </tr> <tr> <td>element3</td> <td>&nbsp;</td> </tr> <tr> <td>element4</td> <td>element5</td> </tr> <tr> <td>element6</td> <td>&nbsp;</td> </tr> <tr> <td>element7</td> <td>element8</td> </tr> <tr> <td>element9</td> <td>element10</td> </tr> </table>
Je ne comprends pas pour quoi je me retrouve avec un "&nbsp;" à la 4ème et la 8ème colonne (que je ne veux pas) et pas la 12ème ?!

par Ryle » 25 sept. 2006, 14:06

Qu'est ce qui ne va pas ?

d'après le code que tu montres, on peut supposer que tu as :
- 2 éléments pour le premier idCat
- 1 élément pour le deuxième (complété d'un espace)
- 2 pour le troisième,
- 1 pour le quatrième (complété d'un espace)
- et 4 pour le dernier...

Le code correspond donc à priori bien à ce que tu souhaites, à savoir toutes tes données sur 2 colonnes :)

En revanche, le fait de faire un nouveau tableau à chaque fois (au lieu de juste faire une nouvelle ligne) fait que tes cellules ne seront pas alignées verticalement entre deux tableaux. Le navigateur va donc gérer la taille de celle-ci en fonction du contenu et si la première cellule contient du texte quand la seconde ne contient qu'un espace, elle sera beaucoup plus large.

Ajoute un width="50%" à tes <td> (puisqu'il y en a 2 par ligne), je pense que tu devrais obtenir l'effet désiré :)

par Cobra52 » 25 sept. 2006, 13:24

ça ne change rien.

par Henri » 25 sept. 2006, 12:53

et si tu enlevais le echo echo </table> de ta boucle for ???

par Cobra52 » 25 sept. 2006, 12:11

Bien, bein ça va pas !
   $q = "SELECT catID FROM categories WHERE parent = '$catID'";  
   $r = mysql_query($q);  
   while ($row = mysql_fetch_array($r))  
   {
echo "<table width="90%" border="0" cellspacing="0" cellpadding="0">";  
      $sql_prod = "SELECT nom FROM produits WHERE catID = '" .$row['catID']. "'";  
      $result_prod = mysql_query($sql_prod);  
      $nb = mysql_num_rows($result_prod);  
      $compteur = 0;  
      while ($row = mysql_fetch_array($result_prod))  
      {
/* Si on est à la première de 2 photos, on crée la nouvelle ligne */         
         if ($compteur % 2 == 0)  
         {  
            echo "<tr>";  
         }  
         echo "<td>" .$row['nom']. "</td>";  
/* Si on est à la dernière d'une série de 2 photos, on ferme la ligne */                           
         if (($compteur + 1) % 2 == 0)  
         {  
            echo "</tr>";  
         }  
         $compteur++;  
       }
/* Si le nombre de photo est un multiple de 2, on ferme le tableau */  
       if($nb % 2 == 0)  
       {  
          echo "</table>";  
       }
/* Sinon, on comlpète avec des cellules vides avant de fermer le tableau */  
       else  
       {  
       $reste = ($nb % 2);  
       for($j = 0; $j < $reste; $j++)  
       {  
            echo "<td>&nbsp;</td>";  
       }  
            echo "</tr>";  
            echo "</table>";  
       }  
   }  
Resultat html (nombre d'éléments retournés = ok) :

Code : Tout sélectionner

<table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element1</td> <td>element2</td> </tr> </table> <table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element3</td> <td>&nbsp;</td> </tr> </table> <table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element4</td> <td>element5</td> </tr> </table> <table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element6</td> <td>&nbsp;</td> </tr> </table> <table width="90%" border="0" cellspacing="0" cellpadding="0"> <tr> <td>element7</td> <td>element8</td> </tr> <tr> <td>element9</td> <td>element10</td> </tr> </table>
Pour terminer, je donne ma langue au chat :lol: