Problème pour afficher une double requête avec PHP/MySQL [Résolu/Fermé]

Signaler
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
-
Messages postés
32397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 mai 2021
-
Bonsoir,
Je voudrais afficher correctement une double requête en PHP/MySQL. En fait, il s'agit d'afficher des articles selon leur date. Exemple : 2014 > 12 > article.
Pour le moment, mon code m'affiche deux fois la même année (2014 en l'occurence) alors que j'aimerais qu'il groupe les deux et qu'il affiche une seule fois l'année 2014 en groupant tous les articles de cette année parus sur différents mois.
Voilà mon code actuel :
<table>
<?php
$req15 = $bdd->query('SELECT * FROM articles ORDER BY yr ASC LIMIT 10');
while($req25 = $req15->fetch())
{
?>
<tr>
	<th colspan="2"><?php echo $req25['yr']; ?></th>
</tr>
<?php
$req35 = $bdd->query('SELECT * FROM articles WHERE yr="'.$req25['yr'].'" ORDER BY mo ASC');	
while($req45 = $req35->fetch())
{
?>
<tr>
	<th><?php echo $req45['mo']; ?></th>
</tr>
<?php
$req55 = $bdd->query('SELECT * FROM articles WHERE yr="'.$req25['yr'].'" AND mo="'.$req45['mo'].'" ORDER BY dy ASC');

while($req65 = $req55->fetch())
{
?>
<tr>
<td>
	<a href="#" rel="nofollow noopener noreferrer" target="_blank">
	<?php echo $req65['titre']; ?>
	</a>
</td>
</tr>
<?php
}
}
}
$req15->closeCursor();
$req35->closeCursor();
$req55->closeCursor();
?>

Voilà le résultat :

Voilà ma base de données :

Je suis sûr qu'il s'agit de quelque chose de simple mais je galère depuis un moment.
Par avance je vous remercie de votre aide.
Cordialement,
polarbird

3 réponses

Messages postés
32397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 mai 2021
3 471
Bonjour,

oulaaa....
Pas besoin de faire x requêtes ....
Une seule suffit .... ensuite il faut jouer avec des IF/else pour afficher ce que tu désires.

Par exemple
echo "<table>";

$result = $bdd->query('SELECT * FROM articles ORDER BY yr ASC, mo ASC LIMIT 10');

$annee_prec = NULL;
$mo_prec =NULL;

while($rows = $result->fetch()){
  
  $annee = $rows['yr'];
  $mo = $rows['mo'];
  $titre = $rows['titre'];
  
  if($annee != $annee_prec){
    echo "<tr><th colspan='2'>$annee</th></tr>";
  }
  
  if($mo != $mo_prec){
    echo "<tr>
          <th>$mo</th>
          </tr>";
  }
  
  echo "<tr>
         <td>
          <a href='#' rel="nofollow noopener noreferrer" target="_blank" rel=\"nofollow noopener noreferrer\" target=\"_blank\">$titre</a>
         </td>
        </tr>";
  
  $mo_prec = $mo;
  $annee_prec = $annee;
}

echo "</table>";

$req55->closeCursor();
?>


Cordialement, 
Jordane                                                                 
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
1
Bonjour Jordane,
Merci beaucoup pour ta réponse, elle m'a bien aidée ! C'est exactement ça ! Par contre à quoi sert le LIMIT 10 à la ligne 3-4 s'il te plaît ? Je veux afficher des articles et par la suite, il se peutr qu'il y en ait pas mal, cela ne va pas gêner tu penses ?
Cordialement,
polarbird
Messages postés
32397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 mai 2021
3 471 >
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020

J'ai juste copié ta requête...
A toi d'adapter à tes besoins. ..
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
1
Okay merci. Juste une dernière question : je voudrais organiser cela en liste, l'utilisation du tableau était juste pour faire plus simple pour la présentation.Je voudrais présenter ça comme cela : https://codepen.io/anon/pen/dWzORR . Simplement avec ta requête je n'arrive pas à le faire, il y a toujours un problème. Voilà mon code et voilà ce que cela me donne.
<?php
$result = $bdd->query('SELECT * FROM articles ORDER BY yr ASC, mo ASC LIMIT 10');

$annee_prec = null;
$mo_prec = null;

while($rows = $result->fetch()){
  $annee = $rows['yr'];
  $mo = $rows['mo'];
  $titre = $rows['titre'];
  if($annee != $annee_prec){
?>
<li><?php echo $annee; ?>
<?php
  }
  if($mo != $mo_prec){
?>
<?php echo $mo; ?>
<?php
  }
if($mo != $mo_prec && $annee != $annee_prec){
?>
<a href="#" rel="nofollow noopener noreferrer" target="_blank"><?php echo $titre; ?></a>
<?php
echo '</li>';

  $mo_prec = $mo;
  $annee_prec = $annee;
}
}
$result->closeCursor();
?>

Cela me donne :
<li>201411<a href="#" rel="nofollow noopener noreferrer" target="_blank">Manifestations en Roumanie</a>
</li>12<li>201510<a href="#" rel="nofollow noopener noreferrer" target="_blank">q</a>
</li><li>201703<a href="#" rel="nofollow noopener noreferrer" target="_blank">qaqaq</a>
</li>

Je galère depuis 3 heures et malgré mes recherches je ne trouve pas de solution :/
Messages postés
32397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 mai 2021
3 471
Bonsoir,

1 - Évite d'ouvrir/fermer des balises PHP partout .... c'est franchement illisible !
Compare ton code avec mon précédent (ou le nouveau ci-dessous) pour voir la différence !


2 - Pour poster du code sur le forum.. merci d'indiquer le LANGAGE dans les balises de code histoire d'avoir la couleur ( explications ICI : Utilisation_des_balises_de_code )


3 - Tu as légèrement oublié les balises <UL> dans ton code ...


4 - Changeons la façon de faire....
On va retravailler le résultat de ta requête pour en faire un array associatif beaucoup plus facile à utiliser....
Essaye ça :
<?php
$result = $bdd->query('SELECT * FROM articles ORDER BY yr ASC, mo ASC LIMIT 10');

$arr_liste = array();
while($rows = $result->fetch()){
  $annee = $rows['yr'];
  $mo = $rows['mo'];
  $titre = $rows['titre'];
  $arr_liste[$annee][$mo][]=$titre; 
}
$result->closeCursor();


echo "<ul>";
foreach($arr_liste as $A=>$M){
  echo "<li>" . $A;
  echo "<ul>";
  foreach($M as $Mkey=>$T){
    echo "<li>".$Mkey;
    echo "<ul>";
    foreach($T as $Titre){
      echo '<li><a href="#" rel="nofollow noopener noreferrer" target="_blank">'.$Titre.'</a></li>';
    }
    echo "</ul>";
    echo "</li>";
  }
  echo "</ul>";
  echo "</li>";
}
echo "</ul>";

?>

Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
1
Merci beaucoup de ta réponse et de tes conseils jordane45. J'ai toujours eu du mal avec les arrays c'est pourquoi je cherchais plutôt avec while. Le résultat est parfait, merci !
Bonne soirée,
Cordialement,
polarbird
Messages postés
32397
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
11 mai 2021
3 471 >
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020

Si la question est résolue ... merci de mettre le sujet en RESOLU (lien en haut, sous le titre de ta question)