Affichage d'un tableau un peu compliqué

Yanndoe
Invité n'ayant pas de compte PHPfrance

31 mars 2016, 09:24

Bonjour et tout d'abord merci a cette communauté qui m'a bcp apporté par le passé. (Et qui m'apporte encore , oui je suis tirs un débutant :p ).
Aujourd'hui je m'emmele un peu les pinceaux pour l'affichage d'un tableau dont certaine cases sont soumises à conditions (du moins c'est ce que je pense)

J'ai une table repas (dateRepas, moment), je cherche à afficher:

Dans la première colonne la dateRepas, dans la seconde le nombre de repas le midi, dans la dernière le nombre de repas le soir. Sachant bien sur qu'il peut y avoir des repas le midi et des repas le soir pour la même date.

Je pense que ma requête est bonne:

Code : Tout sélectionner

$req=$bdd->prepare('SELECT moment, dateRepas, COUNT(*) AS nbrRepas FROM repas WHERE dateRepas BETWEEN ? and ? GROUP BY dateRepas ORDER BY dateRepas'); $req->execute(array($dateMin, $dateMax));
J'ai donc le nombre total de repas par jour pour une période donnée.

Maintenant je veux l'afficher en tableau en dissociant Midi/Soir, et la je bute, voici mon essai le plus "abouti", je ne comprend pas pourquoi cela m'affiche des valeurs fantaisistes.... :

Code : Tout sélectionner

<table> <tr> <th>Date</th> <th>Nombre de repas midi</th> <th>Nombre de repas soir</th> </tr> <?php $nbrRepasTotal=0; while ($donnees=$req->fetch()) { $dateRepas=$donnees['dateRepas']; $nbrRepas=$donnees['nbrRepas']; $nbrRepasTotal=$nbrRepasTotal+$nbrRepas; $nbrRepasSoir=0; if ($donnees['moment']=="Soir") { $nbrRepasSoir=$nbrRepasSoir+1; $nbrRepas=$nbrRepas-1; } echo '<tr><th>'.$dateRepas.'</th><th>'.$nbrRepas.'</th><th>'.$nbrRepasSoir.'</th></tr>'; } echo 'Total de repas pour cette pÈriode: '.$nbrRepasTotal; ?> </table>
Je ne sais pas ce que vous en pensez, mais je ne pense pas être trop loin?

En tout cas ne rigolez pas trop svp, je découvre :p

En vous remerciant par avance pour votre expertise....

Mammouth du PHP | 1029 Messages

31 mars 2016, 10:07

Bonjour et si tu rajoute moment dans le group by ?
L'expérience est la somme de toutes nos erreurs.

Yanndoe
Invité n'ayant pas de compte PHPfrance

31 mars 2016, 10:42

Bonjour et merci, alors cela ne marche tirs pas mais il y a un changement:

Dans la requête postée, j'avais des résultats fantaisistes lorsque qu'il y avait un repas du soir dans la période donnée.

Maintenant le tableau ne s'affiche tout simplement pas s'il y a un repas du Soir dans la période...

A priori la requête est déjà bonne? Je peux me concentrer sur son traitement?

Mammouth du PHP | 1029 Messages

31 mars 2016, 10:58

Le mieux serait d'avoir un jeu de données de la db, que je puisse faire des tests.

Mais ceci me gène déjà

Code : Tout sélectionner

 $nbrRepasTotal=$nbrRepasTotal+$nbrRepas;       $nbrRepasSoir=0;       if ($donnees['moment']=="Soir") {          $nbrRepasSoir=$nbrRepasSoir+1;          $nbrRepas=$nbrRepas-1;       }  
Donc le repas du soir ne pourras jamais être égale qu'a 1, puisque à chaque boucle c'est remis à zéro.

De plus ne faudrait-il pas faire un fetchAll() et non pas un fetch() ?
L'expérience est la somme de toutes nos erreurs.

Petit nouveau ! | 6 Messages

31 mars 2016, 11:04

Je m'en vais regarder la doc pour mieux comprendre, je reviens des que :)

Pour ma part, c'est tout le "if" en fait qui me gène: il me provoque un non-affichage du tableau 1 fois sur 2 (exactement ), même sans repas su soir.

Je me demande si la logique de déduire les repasSoir du repasTotal pour obtenir les repasMidi est bonne déjà...

Bon je vais regarder ce fetchall

Encore merci de m'aiguiller c'est cool!

Mammouth du PHP | 1029 Messages

31 mars 2016, 11:23

Effectivement, essaye ta requête dans un ide database (phpmyadmin par exemple), car pour moi le fait de faire group by moment devrais te donner un ligne par moment différent avec le bon compte.
L'expérience est la somme de toutes nos erreurs.

Petit nouveau ! | 6 Messages

31 mars 2016, 12:16

Bon j'ai fait quelques modifs.
Je ne sais pas si c'est ça qui a provoqué le changement, mais dans la requête, en inversant l'ordre des 2 éléments après le SELECT, la fonction m'a retournée une fois, et une fois seulement, pour une période d'un jour, les 2 lignes suivantes, qui sont toutes a fait correctes, hormis qu'elles soient sur 2 lignes et non 1:

DATE----------------NbrRepasMidi-------------------NbrRepasSoir
01/01/2016---------------2-----------------------------------0----------------
01/01/2016---------------0-----------------------------------1----------------

Et cela correspond! Reste qu'il y a 2 lignes par date d'affichées (pas glop mais pour le nombre de fois ou des repas sont pris le soir , cela pourrait encore passer), et ensuite je ne comprends pas pk cela bug après le 2nd essai, cela ne m'affiche plus le tableau.

Pour résumer, 3 points:
-L'odre des éléments qui sont SELECT est il important? (Au vu de l'ordre de traitement qui en est fait après)
-J'ai l'impression qu'une fois que le IF a été activé, il bug ensuite. (Sans message d'erreur, juste un non affichage du tableau)

-En repartant de zéro, y aurait il un autre moyen de résoudre la problématique énoncée dans le premier post?


J'avoue je pousse peut être le bouchon un peu loin, mais je vous assure que j'ai bcp bcp cherché avant de venir quémander de l'aide.... Et je cherche tirs là je commence à saturer de voir cette partie de code en boucle (sans mauvais jeux de mots...)

Merci déjà pour le temps consacré!

Mammouth du PHP | 1029 Messages

31 mars 2016, 13:02

Pour moi, il est normal de recevoir plusieurs lignes.
Si dans 'moment' on a midi ou soir cela veut dire deux élément différents.
Je pense que tu n'as pas toutes la maîtrise du SQL.

Comme je te l'ai dit passe ta requête dans phpMyAdmin pour que tu puisses comprendre ce que tu reçois.
L'expérience est la somme de toutes nos erreurs.

Petit nouveau ! | 6 Messages

31 mars 2016, 13:16

Oui j'ai vu ce que cela me retourne, et je pensais pouvoir tout afficher en une requete+un traitement, je vais plutôt m'orienter vers 2 requêtes, cela sera plus lourd, moins carré, mais j'aurais mon résultat. Je planche dessus ce soir!

Encore merci de tes explications!

Mammouth du PHP | 1029 Messages

31 mars 2016, 13:28

Oui, ou si ça retourne toujours deux lignes (c'est à dire, il y a pas d'autres moment):

Code : Tout sélectionner

<?php $req=$bdd->prepare('SELECT moment, dateRepas, COUNT(*) AS nbrRepas FROM repas WHERE dateRepas BETWEEN ? and ? GROUP BY dateRepas,moment ORDER BY dateRepas'); $req->execute(array($dateMin, $dateMax)); $result = $req->fetchAll(); <table> <tr> <th>Date</th> <th>Nombre de repas midi</th> <th>Nombre de repas soir</th> </tr> <?php echo '<tr><th>'.$result[0]['dateRepas'].'</th><th>'.$result[0]['nbrRepas'].'</th><th>'.$result[1]['nbrRepas'].'</th></tr>'; echo 'Total de repas pour cette pÈriode: '.$result[0]['nbrRepas'] + $result[1]['nbrRepas']; ?> </table>
L'expérience est la somme de toutes nos erreurs.

Petit nouveau ! | 6 Messages

01 avr. 2016, 08:49

Bonjour, bon malgré une bonne nuit de sommeil, elle n'a pas su me donner le bon conseil, il me manque encore beaucoup de briques dans ma comprehension de PHP, notamment celle ci:

J'ai bien récupéré par 2 requêtes différentes mes 2 COUNT, l'un pour le nombre de repas du Midi, l'autre pour le nombre de repas du soir. Pour une période variable donnée.
Mais voilà, je ne vois pas comment faire correspondre dans un tableau, pour une date de cette période, le nombre de repas du midi et dans la colonne à coté ceux du soir. Je vois bien comment afficher un tableau avec tous les COUNT pour le midi et un autre pour ceux du soir, mais je me heurte à traiter leur affichage dans un tableau unique: DATE------------MIDI-------------SOIR

Un dernier coup de pouce serait il envisageable svp? Suis-je dans la bonne logique au moins? Ou je doit prendre le problème sous un autre angle (faire 2 tableau et puis basta?) ?

Mammouth du PHP | 1029 Messages

01 avr. 2016, 09:07

Mon code juste au dessus fait ça
L'expérience est la somme de toutes nos erreurs.

Petit nouveau ! | 6 Messages

01 avr. 2016, 11:56

En effet mea culpa, j'avais mal retranscris ceci dans ma boucle (j'ai simplifié le code que j'ai posté).

Je touche au but. Je vois comment bien l'intégrer, mais subsiste une subtilité avec ce genre d'exemple:

DATE----------Midi---------Soir

Jour1------------2-------------1
Jour2------------0-------------3
Jour3------------2-------------0

Lorsqu'il y a 0 repas, il n'y a pas d'array retourné. Donc:

-Comment retournée un array aux valeurs 0
Ou
-Comment géré lorsque qu'il n'y a pas d'array retourné?

Car ôte moi d'un doute, mais il faut bien gérer la boucle à base de $result[i][valeurrecherchée] , i++ , tant qu'il y a des données dans $result?

En tout cas j'ai vraiment l'impression d'avoir appris un nouveau moyen de traitement par tes conseils! Et j'ai hate de le réutilisé pour optimiser un précédent code :D

Merci encore de ta patience.....

Petit nouveau ! | 6 Messages

01 avr. 2016, 13:52

Visiblement je ne suis pas le seul sur le net qui ai cherché à afficher un 0 en lieu et place d'un COUNT=NULL. J'ai une belle après midi de test en perspective ^^