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

Résolu/Fermé
polarbird
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
- 2 mai 2017 à 23:44
jordane45
Messages postés
35415
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 mai 2022
- 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

3 réponses

jordane45
Messages postés
35415
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 mai 2022
4 148
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
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
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
35415
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 mai 2022
4 148 > polarbird
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020

3 mai 2017 à 19:29
J'ai juste copié ta requête...
A toi d'adapter à tes besoins. ..
0
polarbird
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
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
35415
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 mai 2022
4 148
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
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020
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
35415
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 mai 2022
4 148 > polarbird
Messages postés
93
Date d'inscription
vendredi 24 juin 2011
Statut
Membre
Dernière intervention
29 décembre 2020

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