Problème pour afficher une double requête avec PHP/MySQL

Résolu/Fermé
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 - 2 mai 2017 à 23:44
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 - 3 mai 2017 à 22:02
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
A voir également:

3 réponses

jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
Modifié le 3 mai 2017 à 00:05
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                                                                 
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
3 mai 2017 à 17:00
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
3 mai 2017 à 19:29
J'ai juste copié ta requête...
A toi d'adapter à tes besoins. ..
0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
3 mai 2017 à 20:24
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 :/
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
3 mai 2017 à 21:44
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>";

?>

0
polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023 1
3 mai 2017 à 21:55
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
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649 > polarbird Messages postés 105 Date d'inscription vendredi 24 juin 2011 Statut Membre Dernière intervention 16 décembre 2023
3 mai 2017 à 22:02
Si la question est résolue ... merci de mettre le sujet en RESOLU (lien en haut, sous le titre de ta question)
0