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 :

Générer fichier xml avec php


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut Générer fichier xml avec php
    Bonjour à tous,

    Afin d'établir un graphique météo (avec amCharts), je dois générer via php un fichier xml.
    Ceci est fait avec ce script php :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    <?php
    header('Content-Type: text/xml');
     
    //Configuration database
    include("../aaaa.php");
     
    // connect to database
    mysql_connect($host, $user, $passwd)
    or die ('Unable to connect to server.');
     
    mysql_select_db($dbname)
    or die ('Unable to select database.');
     
    // select last entries
    $query = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -24 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    $res = mysql_query($query);
     
    // put all the data inside an array
    $arr = array();
    while($obj = mysql_fetch_object($res)){
      $arr[] = $obj;
    }
     
    // echo xml
    echo "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n";
    echo "<chart>\n";
    echo "<series>\n";
     
    // echo series
    for ($i = sizeof($arr) - 1; $i > 0; $i--) {  
      $date = $arr[$i]->timestamp_mesure; 
      echo "<value xid=\"$i\">$date</value>\n";
    }
    echo "</series>\n";
     
    // echo graphs
    echo "<graphs>\n";
    // first graph
    echo "<graph title=\"Aujourd'hui\" gid=\"0\">\n";
    for ($i = sizeof($arr) - 1; $i > 0; $i--) {  
      $valeurs = $arr[$i]->valeur_mesure; 
      echo "<value xid=\"$i\">$valeurs</value>\n";
    }
    echo "</graph>\n";
     
    echo "</graphs>\n";
    echo "</chart>";
     
    ?>
    Mon problème est que une ligne est inserée dans la BDD, chaque fois qu'une donnée est reçu du capteur de température et que celle-ci a évolué par rapport à la précédente. S'il n'y a pas d'évolution, aucune data n'est insérée.

    Je voudrais générer le fichier xml de la façon suivante.
    - 1 données toutes les 15 minutes
    - Si pas de données depuis 2h par exemple, sélectionner la valeur précédente.

    Dans ma base, les valeurs timestamp_mesure sont au format 20110921123000.

    Je ne vois pas trop comment faire, il faut faire une boucle, mais comment récupèrer la dernière valeur, et si celle-ci n'existe pas.

    Merci pour votre aide. Mikael

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    mon explication ne devait pas être trés claire...

    J'ai essayé de décrire ce que php doit faire, on verra ensuite pour le code.... :

    -Faire une boucle qui parcours YYYYMMDD 00:00 à YYYYMMDD 23:45, par étape de 00:15
    - Rechercher dans le Array YYYYDDMM HHMM (où YYYYDDMM HHMM = boucle1), si pas
    -Générer le fichier xml
    Pour le code, j'essaye, J'ai mis en bleu ce dont j'aurai besoin d'aide pour écrire le code :

    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
    $query = "SELECT timestamp_mesure, valeur_mesure FROM releves WHERE timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -26 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    $res = mysql_query($query);
     
    // put all the data inside an array
    $arr = array();
    while($obj = mysql_fetch_object($res)){
      $arr[] = $obj;
    }
    for YYYYMMDD0000 to YYYYMMDD2345 step  00:15 {
        for ($i = sizeof($arr) - 1; $i > 0; $i--) {  
             $arr2 = array(); 
             RECHERCHER YYYYMMDDHHMM et recuperer valeur_mesure  
             $date = $arr2[$i]->HHMM; 
             $visits = $arr2[$i]->valeur_mesure; 
        }
    }
    Merci Mikael

    [EDIT] @heretik25, J'étais entrain d'écrire mon message, mais il faut croire que j'ai de trop gros doigts, et j'ai validé avant d'avoir terminé mon post !!!

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Par défaut
    Bonsoir,

    T'as une erreur dans ton code ?

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2011
    Messages : 146
    Par défaut
    Une facon très simple de le faire c'est avec des timestamp unix
    Si tu es sur que les valeurs inscrites dans ta db sont bien a heure fixe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "SELECT UNIX_TIMESTAMP(timestamp_mesure) AS Time, valeur_mesure FROM releves WHERE timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -26 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    Ensuite tu remplis ton tableau un peu différemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $arr = array();
    while($obj = mysql_fetch_object($res)){
      $arr[$obj->Time] = $obj->valeur_mesure;
    }
    Ensuite avec la commande mktime : http://php.net/manual/fr/function.mktime.php tu génère tes timestamp de début et de fin

    et tu fait une boucle en ajoutant 15*60 au timestamp pour passer de mesure en mesure que tu récupère avec $arr[$tonincrementdetimestamp]

    Je ne te fait pas tout le code mais je pense que tu comprendras.

    PS : Si les mesure ne sont pas a seconde fixe dans ta base, il suffit de virer les secondes en passant le $obj->Time dans un mktime sans prendre en compte les secondes ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mktime (date("H",$obj->Time) ,date("i",$obj->Time), 0 ,...)
    les ... etant la suite pour mois jour et année

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 407
    Par défaut
    Salut Tolrig,

    Merci pour ta réponse,

    Que veux-tu dire par :
    Si tu es sur que les valeurs inscrites dans ta db sont bien a heure fixe.
    Dans ma base, timestamp_mesure est une heure UDT, et peut être n'importe quelle HHMMSS.

    J'ai essayé de faire le script php, mais je ne l'ai pas testé (je ne suis pas chez moi).
    Je pense qu'il y a une erreur avec mes boucles, mais l'idée principale dans mon code doit être là.

    Mikael


    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    <?php
     
    header('Content-Type: text/xml');
     
    //Configuration de la database
    include("../aaaa.php"); 
     
     
    // connexion à la database
    mysql_connect($host, $user, $passwd)
    or die ('Unable to connect to server.'); 
     
    mysql_select_db($dbname)
    or die ('Unable to select database.'); 
     
     
    // extrait les datas de la BDD
    $query = "SELECT UNIX_TIMESTAMP(timestamp_mesure) AS Time, valeur_mesure FROM releves WHERE timestamp_mesure BETWEEN DATE_ADD(NOW(),INTERVAL -26 HOUR) AND NOW() ORDER BY timestamp_mesure DESC";
    $res = mysql_query($query);
     
    // datas dans un tableau
    $arr = array();
    while($obj = mysql_fetch_object($res)){
    	$arr[$obj->Time] = $obj->valeur_mesure;
    	}
     
    // variable timestamp de début et de fin
    $timestamp_debut = date("YmdHis", mktime(0, 0, 0, date("d",now()), date("m",now()), date("Y",now())));
    $timestamp_fin = date("YmdHis", mktime(23, 45, 0, date("d",now()), date("m",now()), date("Y",now())));
     
     
    // boucle pour récupérer les résultats
     
    for ($i = $timestamp_debut; $i >= $timestamp_fin; $i++) {  
     
    	// boucle pour parcourir le array créer précédemment
     
    	for ($j = sizeof($arr) - 1; $j > 0; $j--) { 
     
    		// Condition pour vérifier si $timestamp_mesure <= $i
     
    		if($i = $timestamp_debut)
    		{
    		$date = $arr[$i]->$timestamp_debut; 
    	        $valeurs = $arr[$i]->valeur_mesure;
     
    		// echo xml
    		echo "<"."?xml version=\"1.0\" encoding=\"UTF-8\"?".">\n";
    		echo "<chart>\n";
    		echo "<series>\n";
     
    		// echo series
    		echo "<value xid=\"$i\">$date</value>\n";
     
    		echo "</series>\n";
     
    		// echo graphs
    		echo "<graphs>\n";
     
    		// first graph
    		echo "<graph title=\"Aujourd'hui\" gid=\"0\">\n";
    		echo "<value xid=\"$i\">$valeurs</value>\n";
     
     
    		echo "</graph>\n"; echo "</graphs>\n";
     
    		}
     
    		echo "</chart>";                 
        }
     
        $timestamp_debut = $timestamp_debut + (15*60);
    }
    ?>

Discussions similaires

  1. [XSLT] Générer des fichiers XML avec PHP
    Par oneTime dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 28/04/2008, 21h27
  2. [DOM] création de fichier XML avec PHP
    Par cortex007 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 09/12/2007, 11h31
  3. [DOM XML] Insertion données dans fichier XML avec PHP pour Flash ?
    Par ExSter dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 10/05/2006, 11h16
  4. [XML] [EXPAT] Parser un fichier xml avec php
    Par Dargos dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 05/04/2006, 12h25
  5. [XML] lire un fichier xml avec php
    Par java_fun dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/03/2006, 12h21

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