Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/09/2011, 12h34   #1
Membre du Club
 
Inscription : février 2009
Messages : 330
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 330
Points : 56
Points : 56
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 :
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
mikael2235 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 22h08   #2
Membre du Club
 
Inscription : février 2009
Messages : 330
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 330
Points : 56
Points : 56
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.... :

Citation:
-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 :
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 !!!
mikael2235 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2011, 22h09   #3
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Bonsoir,

T'as une erreur dans ton code ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 10h12   #4
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
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 :
$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 :
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 :
mktime (date("H",$obj->Time) ,date("i",$obj->Time), 0 ,...)
les ... etant la suite pour mois jour et année
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/09/2011, 15h12   #5
Membre du Club
 
Inscription : février 2009
Messages : 330
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 330
Points : 56
Points : 56
Salut Tolrig,

Merci pour ta réponse,

Que veux-tu dire par :
Citation:
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 :
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);
}
?>
mikael2235 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h02.


 
 
 
 
Partenaires

Hébergement Web