Page 1 sur 1

foreach ou for()

Posté : 27 mai 2010, 11:20
par <Osef>
<foreach> || for() {
echo "Help..";
}

...
Bonjour / Bonsoir,

dans le but de créer un catalogue de produits dynamique ( qui se met à jour tout seul lorsqu'une nouvelle entrée est ajoutée à la bdd ), avec upload d'image et de contenu texte dans plusieurs colonnes, j'ai tenté de faire d'abord à ma sauce avec une simple boucle for( $i=1, $i < $table_total, $i++), je rentre pas maintenant dans les détails de celle ci, mais en gros j'ai constaté que ça marchait pour afficher les contenus mais que la boucle était bizarrement pas très dynamique ( une entrée invisible ou bugguée sur le site, et une image d'index 0 dans le dossier d'uploaded..)

On m'a conseillé par la suite d'utiliser <foreach> que je ne connaissais pas du tout avant et qu'il me semble avoir plus ou moins compris le principe, vous en jugerez de mes commentaires dans le code.
Voila ce que j'ai fais pour le moment :
    <?php
    $connexion = mysql_connect("localhost", "dauvergnej", "dauvergnej");
    $selection_bd = mysql_select_db("web_laboisseraie", $connexion);
    
    //METHODE FOREACH
    
    //SELECTION DU NOMBRE TOTAL D'ENTREES DANS LA TABLE CATALOGUE => BOUCLE
    $tab_nb_total = mysql_query("SELECT COUNT(*) FROM catalogue_cdc");
    
    for ($i=1; $i < $tab_nb_total; $i++){
    
       // SELECTION DE TOUTES LES ENTREES DE LA TABLE CATALOGUE PAR ORDRE DE DATE D'AJOUT DECROISSANT  
       $sql = "SELECT * FROM `catalogue_cdc` WHERE catalogue_cdc='$i' ORDER BY `catalogue_cdc` DESC";
       $tab_row_requete = mysql_query($sql) or die(mysql_error($connexion));

       // GENERE UNE LIGNE DE TABLEAU ASSOCIATIF A PARTIR DE $tab_row_requete
       while($row=mysql_fetch_assoc($tab_row_requete)){
       
       foreach($row as $key=>$value);   // ASSIGNE VALEUR $value DE CHAQUE ENTREE A CHAQUE INDEX $key
       
       echo '</br>';
       print_r($row);
       echo '</br>';
       
       echo "<div> 
                <div>
                  $image.$i
                </div>
                <div>
                  $nom.'$i'
                </div>
                <div>
                  $appellation.'$i'
                </div>
                <div>
                  $millesime.'$i'
                </div>
                <div>
                  $description.'$i'
                </div>
             </div>";
        
       }
     }  

    ?>
Il me semble bien que l'association des valeurs dans le tableau fonctionne car print_r() me retourne cela :

Code : Tout sélectionner

Array ( [catalogue_cdc] => 1 [nom] => Elixir de Joÿ [appellation] => Joÿ [millesime] => 2002 [description] => (bla bla bla..) [image] => etq_elixir_joy.JPG )

Code : Tout sélectionner

Array ( [catalogue_cdc] => 2 [nom] => Esprit de Joÿ [appellation] => Côtes de Gascogne [millesime] => 2002 [description] => (bla bla bla) [image] => etq_esprit_joy.JPG )

Code : Tout sélectionner

Array ( [catalogue_cdc] => 3 [nom] => Domaine du Givaudan [appellation] => Côtes du Rhone [millesime] => 2008 [description] => (bla bla bla) [image] => givaudan.JPG )
Et il ne semble pas y avoir d'entrée "fantôme" comme avec l'autre méthode.

J'essaye en fait d'injecter dans les divs la valeur de chaque colonne, afin de pouvoir les éditer séparément avec des styles. Et j'ai pour le moment en message d'erreur : "Notice: Undefined variable: image", "Notice: Undefined variable: nom", etc.

Quelqu'un connaîtrait t'il mieux cette méthode foreach pour faire cela ?

Re: foreach ou for()

Posté : 27 mai 2010, 11:26
par stealth35
deja
foreach($row as $key=>$value);

tout seul ca sert a rien
pour ton truc ca serait
echo '<div>';
foreach($row  as $key=>$value)
{
    echo '<div>' . $value . $i . '</div>';
}
echo '</div>';

par contre ton COUNT sert a rien, en plus c'est faux, puisque les ID ne se suivent pas forcement (par exemple si tu surprime une entrée)

ta PDO mysql ?

Re: foreach ou for()

Posté : 27 mai 2010, 12:01
par <Osef>
D'abord, merci pour ta réponse aussi rapide !

J'utilise PHPmyAdmin.
Pour le COUNT, si tu as une alternative je suis preneur, car autrement je connais que la requête équivalent à sélectionner la dernière entrée de la colonne auto_increment, mais ça revient un peu au même problème...

Sinon pour foreach, j'ai bien compris le problème de mon code mais je souhaite séparer les colonnes de chaque entrée avec des <div> comme dans mon code.. Ta méthode revient à séparer juste les entrées, ce qui va pas me permettre de mettre en forme le tout après. En gros, je veux séparer les entrées entre elles, et aussi faire une sous séparation des différentes colonnes de chaque entrée.

<div>
<div></div>
<div></div>
<div></div>
</div>


Est ce possible avec foreach ?

Re: foreach ou for()

Posté : 27 mai 2010, 13:23
par stealth35
echo '<div>';
foreach($row  as $key=>$value)
{
    echo '<div>' . $value . $i . '</div>';
}
echo '</div>';
ca va te donner ca

Code : Tout sélectionner

<div> <div>$image.$i</div> <div>$nom.'$i'</div> <div>$appellation.'$i'</div> </div>
et pourquoi t'aurai besoin du dernier id ?
ca reviens a faire juste
SELECT * FROM `catalogue_cdc` WHERE  ORDER BY `catalogue_cdc` DESC

Re: foreach ou for()

Posté : 27 mai 2010, 14:30
par mere-teresa
Pour le COUNT, si tu as une alternative je suis preneur, car autrement je connais que la requête équivalent à sélectionner la dernière entrée de la colonne auto_increment, mais ça revient un peu au même problème...
Tu insères 10 produits, tu COUNT(*) => 10 produits, prochain auto-incrément => 11
Si tu effaces le produit d'ID n°5, tu auras 9 produits, mais le dernier auto-incrément sera 11.

Re: foreach ou for()

Posté : 27 mai 2010, 15:04
par <Osef>
Tu insères 10 produits, tu COUNT(*) => 10 produits, prochain auto-incrément => 11
Si tu effaces le produit d'ID n°5, tu auras 9 produits, mais le dernier auto-incrément sera 11.
Oui ca je l'ai appris en fouillant par hasard dans PHPmyAdmin il y a pas tres longtemps d'ailleurs..
echo '<div>';
foreach($row  as $key=>$value)
{
    echo '<div>' . $value . $i . '</div>';
}
echo '</div>';
ca va te donner ca

Code : Tout sélectionner

<div> <div>$image.$i</div> <div>$nom.'$i'</div> <div>$appellation.'$i'</div> </div>
Question : Comment tu fais après pour mettre des styles différents ou autres à chacune des divs ?
Genre..
<div>
<div style='width:20 height:50'></div>
<div style='overflow : auto'></div>
<div border='1 solid black'></div>
</div>

Re: foreach ou for()

Posté : 27 mai 2010, 15:10
par stealth35
tu peux faire
echo '<div>';
foreach($row  as $key=>$value)
{
    echo '<div class="' . $key . "">' . $value  . '</div>';
}
echo '</div>';
<div>
<div class="image"></div>
<div class="nom"></div>
<div class="appellation"></div>
</div>

dans ton css ensuite
.image{
width:20;
height:50;
}
.nom{
overflow : auto;
}
.appellation{
border:1 solid black;
}
mais dans le fond ton foreach sert pas a grand chose, ca sert dans l'optique ou les champs choisie serais dynamique et/ou nombreux
finalement dans ton cas t'as ni besion de foreach ni de for ducoup

Re: foreach ou for()

Posté : 08 juin 2010, 17:55
par <Osef>
Rebonjour

Après quelque temps, ce projet stagne.
J'ai réussis à injecter le contenu de chaque ligne dans les divs pour une présentation sympa en css, mais je remarque que la boucle ne semble toujours pas fonctionner..
Le lien a la BDD fonctionne car je vois les nouvelles entrées dans PHPmyAdmin, l'upload aussi car j'ai bien les images dans le dossier désiré, mais l'affichage sur la page web reste toujours sur le même nombre d'entrées, en l'occurence 4. Je peux en rajouter, il ne veut rien savoir. Je peux en supprimer côté BDD et côté dossier upload, et je me retrouve avec une "entrée fantôme", un espace vide et une image lien mort.

Code : Tout sélectionner

<?php $connexion = mysql_connect("localhost", "dauvergnej", "dauvergnej"); $selection_bd = mysql_select_db("web_laboisseraie", $connexion); //METHODE FOREACH //SELECTION DU NOMBRE TOTAL D'ENTREES DANS LA TABLE CATALOGUE => BOUCLE $tab_nb_total = mysql_query("SELECT * FROM catalogue_cdc ORDER BY catalogue_cdc DESC"); for ($i=1; $i < $tab_nb_total; $i++){ // SELECTION DE TOUTES LES ENTREES DE LA TABLE CATALOGUE PAR ORDRE DE DATE D'AJOUT DECROISSANT $sql = "SELECT * FROM `catalogue_cdc` WHERE catalogue_cdc='$i' ORDER BY `catalogue_cdc` DESC"; $tab_row_requete = mysql_query($sql) or die(mysql_error($connexion)); // AFFICHAGE DE L'IMAGE DANS LIEN ET DIV echo '<div class="catalogue_row"><a href="contact.html"><img class="imageup" src="images/catalogue/catalogue_img' .$i. '.jpg"/></div></a>'; // GENERE UNE LIGNE DE TABLEAU ASSOCIATIF A PARTIR DE $tab_row_requete while($row=mysql_fetch_assoc($tab_row_requete)){ // ASSIGNE VALEUR $value DE CHAQUE ENTREE A CHAQUE INDEX $key DANS LIEN ET DIV foreach($row as $key=>$value){ echo '<a href="contact.html"><div class="' . $key. '">' . $value . '</div></a>'; } } } ?>
Si quelqu'un a une solution, qu'il le fasse savoir svp :priere:

Re: foreach ou for()

Posté : 08 juin 2010, 17:57
par stealth35
et pourquoi t'aurai besoin du dernier id ?
ca reviens a faire juste
SELECT * FROM `catalogue_cdc` WHERE  ORDER BY `catalogue_cdc` DESC

:wink:

Re: foreach ou for()

Posté : 17 juin 2010, 12:36
par <Osef>
Rebonjour tout le monde, désolé pour l'attente j'ai eu quelques préoccupations prioritaires qui ont fait retarder ce projet. Mais je suis de nouveau à fond dessus, le temps que je m'y retrouve dans mon code ^^

Par rapport à ta remarque stealth35, il m'a semblé qu'avec :

Code : Tout sélectionner

$tab_nb_total = mysql_query("SELECT * FROM catalogue_cdc ORDER BY catalogue_cdc DESC"); $nb_total = mysql_num_rows($tab_nb_total); for ($i=1; $i < $nb_total; $i++){
la boucle serait mieux bouclé, car si je ne me trompe pas SELECT * FROM catalogue_cdc ORDER BY catalogue_cdc DESC ne retourne pas un nombre entier, non ?

Mais la boucle me fait toujours des choses bizarres..
Un exemple si ca peut vous aider à visualiser le problème :
Lorsque j'ai deux entrées dans ma bdd, le tableau affiche deux entrées mais lorsque j'en ai 3 dans ma bdd, le tableau affiche 2 x 3 entrées ...

Cela est un autre problème à la boucle, mais en plus de cela, l' image ne s'affiche pas à chaque ligne de tableau, mais plutôt à chaque répétition de toutes mes entrées ! Je soupçonne une simple omission dans la syntaxe ou quelque chose de bête comme cela ..