Généralement on évite les boucles de requêtes et on fait plutôt une requête unique qui ramène l'ensemble des données nécessaires, puis on met en forme le résultat avec PHP.
1 2 3
| $sql_COUNT1 = 'SELECT COUNT(date_passage) FROM passages WHERE MONTH(date_passage)="'.$mois.'" AND YEAR(date_passage)="'.$annee.'" AND heure_passage>="08:00:00" AND heure_passage<="09:00:00" BETWEEN "'.$date_debut_en.'" AND "'.$date_fin_en.'"';
...
$sql_COUNT2 = 'SELECT COUNT(date_passage) FROM passages WHERE MONTH(date_passage)="'.$mois.'" AND YEAR(date_passage)="'.$annee.'" AND heure_passage>="09:00:00" AND heure_passage<="10:00:00" BETWEEN "'.$date_debut_en.'" AND "'.$date_fin_en.'"'; |
Beaucoup de choses ne vont pas.
Il y a un problème de syntaxe avec ton SQL et la clause BETWEEN redondante avec MONTH() et YEAR(). Ton SQL mal formaté rend cela difficile à identifier, et le PHP mal utilisé vient obscurcir tout cela.
Autre chose, en SQL on délimite les chaînes avec ' et pas " (qui sert à délimiter les noms d'objet).
MONTH() retourne un numéro de mois sans zéro initial (ex, 9 et pas 09 pour septembre), ainsi je ne comprends pas les " (qui devraient être des ') autour de $mois.
AND heure_passage<="10:00:00" BETWEEN "'.$date_debut_en.'" AND "'.$date_fin_en.'"';
Par ailleurs, avec ton système actuel les valeurs aux bornes seraient comptés 2 fois
Ton modèle auquel j'ajoute une colonne id :
passages
-------------
id
date_passage (date)
heure_passage (time)
Requête unique donnant le nombre de passage par tranche horaire sur une période donnée :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| $date_debut_en = '2024-01-08';
$date_fin_en = '2024-01-14';
$sql = <<<SQL
SELECT ALL
date_passage,
TIME_FORMAT(heure_passage, '%H:00:00') AS heure_passage, -- On ne garde que la composante "heure" pour le groupement, ex. 09:49:23 => 09:00:00
COUNT(*) AS volume
FROM passages
WHERE date_passage BETWEEN '{$date_debut_en}' AND '{$date_fin_en}'
GROUP BY 1, 2 -- Groupement sur les colonnes numéro 1 et 2
ORDER BY 1 ASC, 2 ASC -- Tri sur les colonnes numéro 1 et 2
SQL;
$data = $pdo->query($sql)->fetchAll(); |
Cette requête unique donnera un tableau $data contenant des données de base comme :
date_passage heure_passage volume
2023-01-08 06:00:00 2
2023-01-08 08:00:00 6
2023-01-08 09:00:00 19
2023-01-08 12:00:00 17
...
2023-01-14 17:00:00 5
2023-01-14 20:00:00 2
Il ne reste plus qu'à boucler sur ton calendrier et/ou $data pour afficher les données. À ce niveau tu ne donnes pas suffisamment d'infos pour que j'en dise plus.
TIME_FORMAT() => https://dev.mysql.com/doc/refman/8.0...on_time-format
Partager