Aller au contenu

Boucle While ne listant pas toutes les données


joboy84

Sujets conseillés

Bonjour,

J'ai un problème avec mon code...

Je souhaite afficher un menu dynamique.

Au lieu de faire une requête pour chaque menu j'ai voulu faire une seule requête pour tous les menus, mais cela ne me retourne rien alors que dans la base il y a bien des éléments correspondants à ma requête.

<?php
//On effectue la requete
$requete = mysql_query('SELECT distinct NomSiteJeux, Categorie FROM FicheSitesJeux') or die ('Erreur: '.mysql_error());

$donnees = mysql_fetch_array($requete);

while($donnees['Categorie'] == "MultiJeux")
{
echo'<li><a href="/presentation-du-site-de-jeux-en-ligne-'.$donnees['NomSiteJeux'].'">'.$donnees['NomSiteJeux'].'</a></li>';
}
?>

Ceci n'est il pas possible?

Sinon, si je fais cela:

<?php
$requete = mysql_query('SELECT NomSiteJeux, Categorie FROM FicheSitesJeux GROUP BY NomSiteJeux') or die ('Erreur: '.mysql_error());
?>
<div id="menu-de-gauche">
<div class="element_menu">
<div class="imageTitreMenusLeft">
<div class="textecentre"><h2>TOP 10 DES JEUX EN LIGNE</h2></div>
</div>
<div class="block-menu-gauche">
<ol>
<?php while($donnees = mysql_fetch_array($requete))
{
if($donnees['Categorie'] == "Top")
{
//On liste les éléments et cela fonctionne, les éléments sont listés !
echo'<li><a href="/presentation-du-site-de-jeux-en-ligne-'.$donnees['NomSiteJeux'].'">'.$donnees['NomSiteJeux'].'</a></li>';
}
}
?>
</ol>
</div>
</div>

<div id="menu-de-gauche">
<div class="element_menu">
<div class="imageTitreMenusLeft">
<div class="textecentre"><h2>Jeux de Grattage</h2></div>
</div>
<div class="block-menu-gauche">
<ol>
<?php while($donnees = mysql_fetch_array($requete))
{
if($donnees['Categorie'] == "Grattage")
{
//Ici, les éléments ne sont pas listés, je ne sais pour quelle raison?
echo'<li><a href="/presentation-du-site-de-jeux-en-ligne-'.$donnees['NomSiteJeux'].'">'.$donnees['NomSiteJeux'].'</a></li>';
}
}
?>
</ol>
</div>
</div>

Dans ce cas, cela m'affiche bien les résultats dans le premier menu, mais dans le second, pour les jeux de grattage, cela ne me retourne rien...

Merci

Lien vers le commentaire
Partager sur d’autres sites

Relis bien ton code et tu verras que c'est assez normal...

Dans le premier cas tu dis: donne-moi la première ligne des résultats de ma requête SQL, et ensuite tu fais une boucle qui dit "tant que la colonne categorie est multijeux, affiche moi le bout de HTML". Mais tu ne passes jamais à la ligne suivante.

Dans le deuxième cas tu fais une requête, puis tu fais une boucle sur chaque ligne du résultat, et si la catégorie est "top" tu affiches. Une fois que tu as parcouru toute la liste, tu refais une autre boucle, mais tu demandes la ligne suivante des résultats, et il n'y en a plus, donc forcément il s'arrête tout de suite.

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Effectivement c'est logique, je m'en était apercu pour le premier cas, c'est pourquoi j'avais commencé à travailler sur le second cas.

Par contre il est donc impossible de faire une seule requete pour récupérer le contenu de tous les menus? Je suis obligé de faire une requête par section?!

Merci

Lien vers le commentaire
Partager sur d’autres sites

Non, c'est tout à fait possible, il y a au moins deux façons de le faire.

Méthode 1: tu fais une requête SQL triée par catégorie (en supposant que les catégories soient dans l'ordre que tu veux, sinon il faudra utiliser une autre table avec les catégories et leur ordre et faire une jointure). A chaque ligne de résultat, tu compares la catégorie avec la dernière affichée. Si elle est différente, tu commences un nouveau menu, sinon tu continues avec le menu actuel.

Méthode 2: tu fais ta requête SQL sans tri particulier, et tu fais une boucle sur les résultats qui place les différents éléments dans un tableau associatif (catégorie -> tableau) de tableaux (lignes de menu). Ensuite tu fais deux boucles imbriquées pour afficher tout ça.

Méthode 3: tu fais ta requête SQL, tu fais une boucle sur les lignes pour les copier dans un tableau à toi. Ensuite tu peux faire autant de boucles que tu veux sur ce tableau pour afficher chaque menu séparément.

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Posté (modifié)

Oula y en a des solutions ! :smartass:

J'étais justement entrain de voir pour mettre le résultat dans un tableau et ensuite pouvoir récupérer les valeurs dans le tableau, mais il est vrai que je ne suis pas très à l'aise avec les tableaux.

Voila ce que j'ai fais pour le moment:

<?php
$tab=array();

$requete = mysql_query('SELECT NomSiteJeux, Categorie FROM FicheSitesJeux WHERE Taille = "Long" GROUP BY NomSiteJeux') or die ('Erreur: '.mysql_error());

while($donnees = mysql_fetch_array ($requete))
{
array_push($tab,$donnees['NomSiteJeux'], $donnees['Categorie']);
}

print_r($tab);
?>

Ce qui me renvoie

Array ( [0] => Marre [1] => Grattage [2] => Testimania [3] => MultiJeux [4] => Toilokdo [5] => Top )

En décortiquant dans la base: Marre appartient a la catégorie Grattage, Testimania à la catégorie Multijeux et Toilokdo à la catégorie Top.

Par contre comment je fais maintenant pour extraire les données du tableau comme je veux pour pouvoir faire un truc du genre if($donneeTab == "Top")... Quelle fonction utiliser?

EDIT: Voila ce que j'ai fais, mais apparemment cela ne fonctionne pas, je dois faire une erreur:

<?php
$tab=array();

$requete = mysql_query('SELECT NomSiteJeux, Categorie FROM FicheSitesJeux WHERE Taille = "Long" GROUP BY NomSiteJeux') or die ('Erreur: '.mysql_error());

while($donnees = mysql_fetch_array ($requete))
{
array_push($tab,$donnees['NomSiteJeux'], $donnees['Categorie']);
}

//print_r($tab);

for($i = 0; $i < count($tab); $i++)
{
if($tab[$i]["Categorie"] == "Top")
{
echo'Nom: '.$tab[$i]["NomSiteJeux"].'';
}
else
{
echo'Aucunes donnees';
}
}

Cela me renvoie toujours Aucunes Donnees alors que Top est bien présent...

Merci encore

Modifié par joboy84
Lien vers le commentaire
Partager sur d’autres sites

Le problème, c'est que là tu mets dans ton tableau à la fois les catégories et les noms des jeux à la file (comme on le voit bien dans le print_r), ce qui fait que c'est un tantinet moins pratique à gérer, il faut que incrémentes i 2 par 2 ($i+=2 au lieau de $i++), et tu as accès aux données par $tab[$i] et $tab[$i+1]

Tu as intérêt à avoir plutôt soit:

- un tableau qui contient des tableaux, ces derniers étant le nom et la catégorie

- un tableau qui contient des tableaux associatifs (même contenu, mais accessible par leur nom plutôt que par des index)

- un tableau associatif (clef = catégorie) qui contient des tableaux (liste de catégories)

Pour ça, tu remplaces ta ligne array_push au choix par:

array_push($tab,array($donnees['NomSiteJeux'], $donnees['Categorie']));

ou

array_push($tab,array('NomSiteJeux' => $donnees['NomSiteJeux'], 'Categorie' => $donnees['Categorie']));

ou

array_push($tab,$donnees);

ou

array_push($tab[$donnees['Categorie']],$donnees['NomSiteJeux']);

Jacques.

Lien vers le commentaire
Partager sur d’autres sites

Re,

Voila j'ai donc utilisé:

<?php
$tab=array();

$requete = mysql_query('SELECT NomSiteJeux, Categorie FROM FicheSitesJeux WHERE Taille = "Long" GROUP BY NomSiteJeux') or die ('Erreur: '.mysql_error());

//$res= mysql_query("select distinct REGION_INFO from info_quotidien order by REGION_INFO ");
while($donnees = mysql_fetch_array ($requete))
{
array_push($tab,array('NomSiteJeux' => $donnees['NomSiteJeux'], 'Categorie' => $donnees['Categorie']));
}

//print_r($tab);

for($i = 0; $i < count($tab); $i++)
{
if($tab[$i]["Categorie"] == "Top")
{
echo'Nom: '.$tab[$i]["NomSiteJeux"].'';
}
}
?>

Cela fonctionne maintenant !

Le code est il correct ainsi ou y a t il moyen d'épurer?

Merci pour ton aide Jacques ;)

Jo

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...