Bonjour,

Voila je rencontre un petit problème avec mon code.
Je galère depuis plusieurs jours .. J'ai sur ma base de donnée plusieurs lignes dans une table avec une colonne " date " sous cette forme http://prntscr.com/ccna4r

Sur mon site j'ai un 5 blocs et j'aimerai que dans les 5 blocs il y ait les derniers matchs trié selon les dernières dates !
Seul bémol.. Les blocs affichent effectivement les dernières dates mais à l'interieur il n y a qu'un seul match qui s'affiche.
http://prntscr.com/ccnaur

 <?php
try
{

}
catch(Exception $e)
{

        die('Erreur : '.$e->getMessage());
}

$req = $bdd->prepare("SELECT * FROM matchs GROUP BY date DESC LIMIT 5");
$req->execute();
foreach ($req as $donnees):
?>

            <div class="panel panel-primary">
  <div class="panel-heading">
    <h3 class="panel-title"><center> du <b><?PHP echo $donnees['date']; ?></h3>
  </div>
  <div class="panel-body">
  <center>

  <div class="table-responsive">
           <table class="table">
            <div class="bs-component">
              <table class="table table-striped table-hover ">
                <thead>
                  <tr>

                    <th>Info</th>
                    <th>Équipe 1</th>
                    <th>Équipe 2 </th>

                    <th>Pronostic</th>
                    <th>Probabilité</th>
                  </tr>
                </thead>
                <tbody>

                <td> <a href="info.php?id=<?PHP echo $donnees['id']; ?>"><img src="info.png" style="width:15px;">  </td>
                    <td><?php echo $donnees['equipe1']; ?></td>
                     <td><?php echo $donnees['equipe2']; ?></td>

                         <td class="primary"> <?php echo $donnees['Pronostic']; ?></font></td>
                         <td>
                         <div class="bs-component">
              <div class="progress progress-striped active">
                <div class="progress-bar <?PHP if($donnees['prc'] < 50){echo'progress-bar-danger';} ?>
                <?PHP if($donnees['prc'] < 75){echo'progress-bar-warning';} ?>
               <?PHP if($donnees['prc'] > 75){echo'progress-bar-success';} ?>

                " style="width: <?PHP echo $donnees['prc']; ?>%"></div>
            </center>
              </div>
            </div> </td>

                  </tr>

    </div></div></div></table>
  </div>
</div>
</tbody></table></div>

<?php

endforeach; 
 ?>

Avez vous une idée à mon problème?

Merci beaucoup !

18 réponses


Après le $req->execute(), ne devrais tu pas faire un fetch ou un fetchAll() ?

Ca devrait ressembler à ça

$req = $bdd->prepare("SELECT * FROM matchs GROUP BY date DESC LIMIT 5");
$req->execute();
$rows = $req->fetchAll();
foreach ($rows as $donnees):
...
?>

Pareil, une prono par case ..

que vaut un var_dump de $rows avant le foreach ?

Un var_dump de $rows avant le foreach me donne les derniers matchs aussi déjà affiché

Donc cela viens de la requête qui est fausse.
Là, elle sélectionne seulement les 5 derniers éléments.

Il est possible, en une seule requête, de ramener les 5 premiers matchs de chaque date mais c'est très compliqué.
Je te conseille de faire une requête qui ramène uniquement les dates, tu les récupères dans un tableau (c'est en gros ce que tu as fait)
tu parcours le tableau avec un foreach et pour chaque itération(chaque date) tu vas chercher les 5 matchs correspondant à la date
Tu peux même ne préparer qu'une seule fois cette requête avant le foreach et il suffira de changer le paramètre 'date' à chaque itération.

Carouge10: Je veux quelle prenne les 5 derniers élèments des boxes par date !

Huggy: J'ai pas très bien compris .. Tu aurais un exemple?

Tu fais un "group by date", donc fatalement, elles sont groupés par date ...
Retire le "group by date", et récupère tous les matchs entre 2 dates (WHERE date BETWEEN etc....)
Et avec le PHP, tu créé le bloc uniquement lorsque la date change.
Tu penseras à faire un ORDER BY date DESC.

J'ai compris ce que vous vouliez, en revanche, je ne sais pas le faire avec une seule requête directement.

Huggy propose de récupérer toutes les données qui correspondent au bloc (sans limites de nombre) et de faire un "for" pour chaque date.

1/ Je récupère toute les informations en les groupant par date.

2/ J'affiche la 1ère date dans le 1er bloc
3/ La date suivante est toujours égale à la date en cours ?
- Oui et j'en ai affiché moins de 6, alors j'affiche les informations
- Non, alors je passe au bloc suivant

4/ J'affiche la 2ème date .....

Kenor: Oui, sauf que la date change chaque jour car chaque jour il y a des matchs !

Voici un exemple avec 2 requêtes

$req = $bdd->prepare("SELECT date FROM matchs GROUP BY date");
$req->execute();
$dates = $req->fetchAll();
// preparation de la 2nd requete
$req2 = $bdd->prepare("SELECT * FROM matchs WHERE date = ? LIMIT 5")
foreach ($dates as $date) {
    $req2->execute(array( $date['date']));
    $rows = $req2->fetchAll();
    foreach($rows as $donnees) :
    ...
...
?>

En essayant ça, la page ne répond plus .. Ca m'a l'air assez dûr à comprendre niveau programmation

$req = $bdd->prepare("SELECT date FROM prono GROUP BY date");
$req->execute();
$dates = $req->fetchAll();

$req2 = $bdd->prepare("SELECT * FROM prono WHERE date = ? LIMIT 5")
foreach ($dates as $date) {
$req2->execute(array($date));
$rows = $req2->fetchAll();
foreach($row as $donnees):
?>

            <div class="panel panel-primary">
  <div class="panel-heading">
    <h3 class="panel-title"><center> du <b><?PHP echo $donnees['date']; ?></h3>
  </div>
  <div class="panel-body">
  <center>

il te suffit de faire un interval de X jours DATE_SUB / DATE_ADD. Pour afficher les X jours avant, et les X jours après.

Ou si tu veux afficher toutes les dates, ne pas mettre de condition. Ou encore, mettre juste une limite au nombre de match que tu veux afficher via un simple "limit X" sans aucun WHERE.

@Huggy : Tu lui demandes de faire une requete par date ... En terme de perf, c'est tout ce qu'il faut éviter.

@Kenor: Je ne comprends pas ton raisonnement :s

Je pourrai dans ces cas là alors faire deux requêtes séparé l'une pour les 5 blocs pour affichers les dernières dates ajouté par matchs, et une autre requête qui regroupe les matchs par date mais ensuite comment ranger les matchs dans les bonnes cases?

Tu peux comme l'a proposé @Kenor ne faire qu'une seule requête sans GROUP BY mais en triant par date,
ensuite tu fais une boucle et tu gères toi même les ruptures de dates
Il te faut un compteur et une variable pour vérifier si on passe à la date suivante ou si on n'a pas atteint 5 matchs