IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Lister dans un tableau html en fonction de l'heure


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 391
    Points : 84
    Points
    84
    Par défaut Lister dans un tableau html en fonction de l'heure
    Bonjour,

    Je dois afficher un nombre de passage en fonction de l'heure et de la date.
    Actuellement je mets la date dans la première colonne via une boucle for mais après je réalise les requetes sur chaque tranche horaire. C'est très long.
    Quel est le meilleur moyen d'optimiser cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <td>
    	<?php 
    		$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.'"'; 
    		$req_COUNT1 = mysql_query($sql_COUNT1) or die(mysql_error());;
    		$COUNT1 = mysql_fetch_assoc($req_COUNT1);
    		echo $COUNT1['COUNT(date_passage)'];
    	?>
    </td>
    <td>
    	<?php 
    		$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.'"'; 
    		$req_COUNT2 = mysql_query($sql_COUNT2) or die(mysql_error());;
    		$COUNT2 = mysql_fetch_assoc($req_COUNT2);
    		echo $COUNT2['COUNT(date_passage)'];
    	?>
    </td>

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 393
    Points : 15 754
    Points
    15 754
    Par défaut
    Citation Envoyé par Devilju69 Voir le message
    C'est très long.
    que trouvez vous long ? la taille de code ou le temps d'exécution des requêtes sql ?

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 391
    Points : 84
    Points
    84
    Par défaut
    C'est le temps d’exécution des requêtes SQL ! La page met énormément de temps à s'afficher car je fais une requête par heure et par mois

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

Discussions similaires

  1. Fonction de recherche dans un tableau HTML
    Par Rudeus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/08/2023, 17h02
  2. [MySQL] Lister le contenu d'une table dans un tableau HTML
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 03/04/2006, 19h40
  3. [MySQL] Afficher mes données dans un tableau HTML
    Par lassmust dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 02/03/2006, 11h43
  4. Réponses: 8
    Dernier message: 14/11/2005, 11h27
  5. Ecrire dans un tableau html depuis une fonction js ?
    Par botanica dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/10/2005, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo