perdu dans les modulos!

Petit nouveau ! | 8 Messages

28 août 2007, 13:07

Bonjour tt le monde!

mon objectif: récupérer une liste de vignettes via une bdd ou un parcours de répertoire et l'afficher dans un tableau de X lignes mais de 2 ou 3 cellules.

Le truc est que je suis perdu, je sais que je dois utiliser un modulo, mais j'ai beau lire et relire les bouts de code qui trainent sur ma machine mais pas moyen d'aligner mon cerveau !!!! :roll: :?:

ce que je voudrais à l'affichage:

<table>
<tr><td>image01</td><td>image02</td></tr>
<tr><td>image03</td><td>image04</td></tr>
<tr><td>image05</td><td>image06</td></tr>
</table>

En gros j'arrive pas a lui dire: " avec le resultat de la requete, affiches moi une ligne de 2 vignettes, reviens a la ligne et affiche moi les deux suivantes :?
Merci d'avance!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2007, 13:47

Ben si tu ne t'en sors pas avec les bouts de code, procédons avec un peu de logique :)

Il faut commencer par compter tes images, et donc utiliser un simple compteur que tu incrémentes à chaque image. Ensuite, si tu ceux deux images par ligne, il te faut donc mettre un retour à la ligne à chaque fois que le compteur indique un multiple de 2, c'est à dire quand il ne reste rien de la division par 2 : $compteur % 2 == 0
$compteur=0;
while (...) {

  if ($compteur % 2 == 0)
    // nouvelle ligne

  // affichage de l'élément

  $compteur++; // incrémentation du compteur

  if ($compteur % 2 == 0) 
    // fin de ligne
}
Reste plus qu'à vérifier que la dernière ligne du tableau est remplie (c'est le cas si $compteur%2 était égal à 0 lorsque l'on a quitté la boucle), sinon il suffit de prendre le résultat pour savoir combien de cellule manque et ajouter une X cellules ou une cellule vide avec un colspan :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 août 2007, 14:07

Un peu de pédagogie, ça fait rentrer la logique dans le crâne:

Ce que tu veux afficher est le suivant:
image1 image2
image3 image4
image5 image6
...

si on sait que tes images font une suite numérique 1, 2, 3, 4, 5, 6, ... on peut les représenter par un compteur $i qui s'incrémente à partir de 1.

et pour les découper en plusieurs parties équivalentes, la fonction ($i modulo x == 0) permettra de découper la suite en ségments qui se terminent tous par un nombre multiple de x c'est à dire un ségment de x éléments.
Le modulo s'écrit % en php.

Dans notre cas, si on veut des ségments de 2 éléments de la suite 1, 2, 3, 4, 5, 6 ...
on utilisera la fonction ($i % 2 == 0) qui donnera: 1,2 et 3,4 et 5,6 et ...

Et si on veut des ségments de 3 éléments, on utilisera la fonction ($i % 3 == 0) qui donnera: 1,2,3 et 4,5,6 et ...

Pour afficher les ségments par ligne, il suffit alors d'insérer un retour à la ligne après chaque detection de ségment ; Sachant que c'est la fonction modulo qui detecte un ségment.

L'algorithme de ségmentation de la suite par le modulo et affichage dans une table HTML, est le suivant:
<?php 
//nombre de colonnes dans la table
$nb_colonnes = 2;
//compteur $i
$i=0;
//Affichage
echo "<table>";
while (......) {//boucle de lecture des données à traiter
    //detection d'un segment = retour à la ligne
    if ($i % $nb_colonnes == 0) echo "<tr>";
   
    //Affichage des données dans une colonne
    echo "<td>.......</td>";

   //Incrémenter la suite $i
   $i++;
}//fin de la boucle de lecture des données
echo "</table>";
//
?>
Maintenant on peut tester la paramétrabilité de l'algorithme en modifiant simplement la valeur du paramètre $nb_colonnes. en y mettant 3 le programme affiche une table à 3 colonnes et ainsi de suite.

Bien, selon cette logique, on vient de réussir un squelette de programme d'affichage d'une table HTML à nombre de colonnes paramètrable et à lignes dynamiques.

Mais ce n'est certes pas l'invention d'aujourd'hui.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 8 Messages

28 août 2007, 14:48

:D ben ca c'est du rapide!!

hmm je crois que je me suis mal m'expliquer pour ce qui est des images. Jai mis image01 image02 etc... pour vous montrer le résultat affichage.
Mes images auront n'importe quel nom: toto.jpg tutu.png titi.gif etc...... que je recup via une requete

Donc je crois pas que le compteur soit nécessaire.?? :roll:

Ensuite je ne vois pas de fin de </tr> ??? normal ??? :roll:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2007, 14:58

Le compteur n'est pas la pour indiquer le nom de l'image mais pour savoir à la combientiemme image on en est, pour calculer le modulo et donc savoir s'il faut ajouter un retour à la ligne ou pas.

Et effectivement, il manque la fermeture du <tr> dans le code de sadek, mais sans chercher trop loin, tu devrais pouvoir trouver où le rajouter et sous quelle condition :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

28 août 2007, 15:36

Merci a tous!! :D

Ca marche!!
jvous laisse le code pour si jamais vous voyez une erreur!
<?php 
include('conf/connection.php');


	$sql = "SELECT vignette FROM ma_voisine_sous_la_douche";
  
  $result = mysql_query($sql);
			if(!$result)die("Erreur sql : $select");
			$ligne=mysql_fetch_array($result,MYSQL_ASSOC);
							
			//nombre de colonnes dans la table
			$nb_colonnes = 2;
			//compteur $i
			$i=0;
			//Affichage
			echo "<table>";
				//boucle de lecture des données à traiter
				while ($ligne) 
				{
				//detection d'un segment = retour à la ligne
				if ($i % $nb_colonnes == 0) echo "<tr>";
   
				//Affichage des données dans une colonne
			echo "<td><img src='img/".$ligne['vignette']."'border='0'/></td>";
	
				//Incrémenter la suite $i
				$i++;
				
				//condition pour fin de ligne 
				if ($i==2) echo "</tr>";

				//fin de la boucle de lecture des données
				$ligne=mysql_fetch_array($result,MYSQL_ASSOC);
				}

			echo "</table>";
					
						
						
?> 

Bon j'espere avoir tt bon! rendu affichage et source hashteumeuleu nikel!
Merci!!!! cya :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2007, 15:47

Euh non, objection votre honneur, le source html doit pas être nickel :p

Ta condition pour afficher le </tr> elle est pas bonne, tu ne l'afficheras que pour la deuxième image et pas pour la 4, la 6, la 8 etc... On est toujours dans du calcul de modulo pour savoir quand est ce qu'il faut fermer la ligne :)

Et il te manquera également une cellule à ton tableau si ton nombre d'image est impaire... :)


Ps : t'as des noms de table vraiment bizares dans ta base.... ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 août 2007, 15:52

simplification et correction pour le "</tr>" que tu ne fais que pour $i==2 :
<?php  
include('conf/connection.php'); 


    $sql = "SELECT vignette FROM ma_voisine_sous_la_douche"; 
   
    $result = mysql_query($sql) or die ("Erreur sql : $sql"); 
                             
            //nombre de colonnes dans la table 
            $nb_colonnes = 2; 
            //compteur $i 
            $i=0; 
            //Affichage 
            echo "<table><tr>"; 
                //boucle de lecture des données à traiter 
                while ($ligne=mysql_fetch_array($result,MYSQL_ASSOC))  
                { 
                //detection d'un segment = retour à la ligne 
                if ($i>0 && $i % $nb_colonnes == 0) echo "</tr><tr>"; 
    
                //Affichage des données dans une colonne 
            echo "<td><img src='img/".$ligne['vignette']."'border='0'/></td>"; 
     
                //Incrémenter la suite $i 
                $i++; 

                } //fin de la boucle de lecture des données 

            echo "</tr></table>"; 
           
?>
Modifié en dernier par sadeq le 28 août 2007, 16:04, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

28 août 2007, 15:56

Euh... ouais... à condition également que $i soit différent de 0 pour le '</tr><tr>', sinon tu vas avoir une première ligne dans ton tableau qui sera "<tr></tr>" avant de commencer à parcourir les images
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

28 août 2007, 16:00

yep j'avais biglouché devant le code!

si $i=0 jai une ligne vide et si $i=1 je me retrouve avec une seule image sur la première ligne
:?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

28 août 2007, 16:05

oops, oeils de lynxe, :lol: , j'ai modifié mon ex post.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 8 Messages

28 août 2007, 16:27

Bon et bien c'est parfait tt ca!! :lol: jpeux enfin admirer ma voisine!!

Par contre Sadeq, quand j'utilise ta méthode pour le "result mysql query", sur les 5 images que je rapporte avec ma façon, j'en ai plus que 3 avec la tienne! :roll: :roll: normal ?? XD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 août 2007, 15:02

Modération :
loremipsum, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.


Pour les 3 ou 5 enregistrements affichés, tu as du oublier de retirer le " $ligne=mysql_fetch_array($result,MYSQL_ASSOC) " pour ne garder que celui du while(), du coup il doit probablement sauter un enregistrement sur deux :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 8 Messages

29 août 2007, 16:12

:wink: oups désolé! j'avais pas vu! encore merci pour l'aide!!