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

PHP & Base de données Discussion :

Tracer un graphique de températures stockés dans une base de donées Mysql


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Par défaut Tracer un graphique de températures stockés dans une base de donées Mysql
    Bonjour à tous.

    Petite mise en situation de mon problème :
    Dans ma maison il y a X capteurs de températures dont les mesures sont stockées toutes les 5 minutes par un logiciel dans une base de donnée. Celui-ci remplit alors une table d'une base Mysql qui à la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       CHAMP            TYPE
      DATETIME        DATETIME
    Id_capteur1        float
    Id_capteur2        float
    Id_capteur3        float
    Id_capteurx        float
        ....           float
    Afin de simuler une utilisation dans le temps, j'ai généré une table simulant un peu plus de 5 ans de relevés de températures. On obtient alors une table d'un peu plus de 40 Mio contenant un peu plus de 635100 enregistrements.

    Ce que je souhaite en faire et pourquoi ?
    Le but d'une telle base de données et bien entendu d'abord et avant tout de permettre de comparer celles-ci d'une année sur l'autre, d'un jour sur l'autre, ect ... Pour ce faire la façon la plus parlante pour nous autres êtres humains se trouve être de mettre en forme ces données dans un graphique. Mais avant cela faut-il encore réussir est extraire ces données et à la mettre en forme pour qu'elles puissent ensuite être interpréter par une solution genre Jpgraph, google chart ou encore Openflashchart (je n'en suis pas encore à choisir ça...)

    Problème premier :
    Extraire les données de la base dans une plage de temps donnée n'est pas vraiment un problème. Par contre, la quantité de données à traiter est telle que si la génération d'un graphique sur une journée ne pose pas de problème, générer ce même graphique pour une année demande un temps de traitement tellement conséquent que cette solution n'est tout simplement pas envisageable...

    Solution à ce premier problème :
    Je me suis alors dit que je devais limiter le nombre de valeurs à traiter par la suite. Je me suis donné comme base 288 valeurs quelque soit la base de temps (288 est le nombre de mesures pour une journée). J'ai donc écrit un bout de code (je suppose que c'est le bon moment pour préciser que je suis débutant) pour voir ce que ça donnerais en temps de traitement :

    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
    17
    18
    19
    20
    21
    22
    23
    24
     
    //Essai génération date
    $start_time = strtotime('11-09-2007 0:00:00');
    $end_time = strtotime('12-09-2007 00:00:00');
     
    $start_mysql_time = $start_time;
    $end_mysql_time = $start_mysql_time + 300;
     
    while ($end_mysql_time <= $end_time)
    {
    $select_time_start = date('Y', $start_mysql_time).'-'.date('m', $start_mysql_time).'-'.date('d', $start_mysql_time).' '.date('H', $start_mysql_time).':'.date('i', $start_mysql_time);
    $select_time_stop = date('Y', $end_mysql_time).'-'.date('m', $end_mysql_time).'-'.date('d', $end_mysql_time).' '.date('H', $end_mysql_time).':'.date('i', $end_mysql_time);
     
    $reponse = $bdd->query('SELECT AVG(Id_capteur1) FROM ' . $tableLogTemp . ' WHERE DATETIME BETWEEN \'' . $select_time_start . '\' AND \'' . $select_time_stop . '\'');
     
    while ($donnees = $reponse->fetch())
    {
    print_r($donnees);
    }
     
    $reponse->closeCursor();
    $start_mysql_time = $end_mysql_time;
    $end_mysql_time = $start_mysql_time + 300;
    }
    Mon problème actuel :
    Vous l'aurez compris, mon bout de code à juste pour but de tester la faisabilité de la chose et il se trouve que ... Ba ce n'étais pas une bonne idée. Chaque requête vers la DB prend plus ou moins 1 seconde. Multipliée par 280... soit un résultat garantie de :

    Fatal error: Maximum execution time of 60 seconds exceeded in D:\xampp\htdocs\V0_4\select_datetime.php on line 35
    Conclusion :
    Si je pense que mon approche du problème est la bonne, il est claire que ma solution ne l'est pas. Quelqu'un aurait t'il une idée pour que je puisse parvenir à mes fins ?

    Merci d'avance ne serais ce que pour le temps pris pour lire tout ça ^^

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Une requête comme ça est trop longue à executer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATE_FORMAT(champ_date, 'd/m/Y'), AVG(Id_capteur1) FROM table WHERE champ_date BETWEEN 2010-01-01 AND 2010-12-31 GROUP BY DATE_FORMAT(champ_date, 'd/m/Y')
    Mais si tu dois présenter régulierement ce graphique, il serait plus judicieux de pré-calculer les périodes passées.

    Au passage n'appelle pas ton champ "DATETIME".
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Par défaut
    Salut sabotage.

    Merci de t'intéresser à mon cas. Malheureusement le nom du champ est imposé par le logiciel qui remplie la base... Donc DATETIME obligatoire.

    Je ne comprend pas ta requête mais je l'ai essayé quand même : Mysql ne retourne aucun enregistrement ... :-s

    En gros ce que je cherche à faire c'est récupérer dans ma base les 105120 valeurs qui sont mesurer en une années et les "convertir" en 288 valeurs qui seront chacune une moyenne d'une tranche de 365 valeurs prises dans la table ...

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    J'ai oublié les guillemets :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DATE_FORMAT(champ_date, 'd/m/Y'), AVG(Id_capteur1) FROM table WHERE champ_date BETWEEN '2010-01-01' AND '2010-12-31' GROUP BY DATE_FORMAT(champ_date, 'd/m/Y')
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 10
    Par défaut
    Après essaie avec la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DATE_FORMAT(  'DATETIME',  'd/m/Y' ) , AVG( 8A000001C3A1E328 ) 
    FROM logtemp
    WHERE DATETIME
    BETWEEN  '2010-01-01'
    AND  '2010-12-31'
    GROUP BY DATE_FORMAT(  'DATETIME',  'd/m/Y' )
    J'obtiens en retour un tableau avec d'un coté : DATE_FORMAT('DATETIME', 'd/m/Y' ) = NULL
    Et de l'autre : AVG( 8A000001C3A1E328 ) = 7.96933722581582

    ...

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pour encadrer le nom de champ c'est ` pas '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DATE_FORMAT(`DATETIME`,  'd/m/Y' ) , AVG( 8A000001C3A1E328) 
    FROM logtemp
    WHERE DATETIME
    BETWEEN  '2010-01-01'
    AND  '2010-12-31'
    GROUP BY DATE_FORMAT(`DATETIME`,  'd/m/Y' )
    A quoi correspond 8A000001C3A1E328 ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Réponses: 0
    Dernier message: 09/10/2012, 17h28
  2. miniature d'images stockés dans une base de donnée mysql
    Par plage dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/07/2011, 12h48
  3. [ODBC] [SQL-Server] affichage d'une image stockée dans une base sql server
    Par ahlemag dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/06/2006, 15h45
  4. [MySQL] Afficher une image stockée dans une base de données
    Par LuckySoft dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 22/04/2006, 12h57
  5. Contenu fichier stocké dans une base de données
    Par t_om84 dans le forum Général Python
    Réponses: 20
    Dernier message: 02/03/2006, 11h45

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