Donnees d'un fichier xml dans une database sql

Résolu/Fermé
Joderic - 6 mai 2020 à 13:47
 Joderic - 15 mai 2020 à 15:00
Bonjour,
J'ai un fichier xml qui est genere tous les jours: status_06052020.xml dont j'aimerai extraire certaines donnees (chaque jour les meme) et les faire remonter de facon automatique dans une base de donnee SQL (phpMyadmin) tournant sur un NAS.
Je souhaiterai avoir une nouvelle ligne chaque jour...
Je ne connnais pas grand chose en PHP et en programation en general, y a t il un moyen simple de faire cela?
Par avance merci.
J


Configuration: Windows / Chrome 81.0.4044.122
A voir également:

2 réponses

jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719
6 mai 2020 à 15:35
Bonjour,

"simple" ? ... notion totalement vague qui dépend de beaucoup de choses.
Par exemple.. pour moi.. oui ça serait simple....
Mais vu ce que tu nous décrit.. pour toi ça sera un peu plus compliqué.

Quoi qu'il en soit, il va falloir que tu apprennes un minimum de choses..

Comment connecter un script php à une bdd
Comment y faire des requêtes sql
Comment lire le contenu d'un fichier xml

Tout ça..ça se trouve super simplement sur le net...

Il n'y a plus qu'une chose à faire... t'y mettre.


PS : Ah oui, juste pour lever tous les doutes... ici on ne code pas à la demande. Par contre, si tu viens avec du code.. et que tu expliques sur quoi tu bloques.. on se fera un grand plaisir de te venir en aide.

0
Merci Jordane pour ces clarifications, oui il faut que je m'y mette.

En fait je sais faire executer tous les jours un script Php par mon Nas (pour par exemple recuperer le fichier xml de mon equipement).
Je sais creer une database et y acceder via Phpmyadmin.
Je sais aussi faire un fichier en php/html avec un formulaire web et faire remonter les donnees ainsi recoltes dans ma base de donnee.
Cela je l'ai fait et ca fonctionne.

Mon fichier xml est tres simple, il a environ 1000 lignes ou des donnees sons renseignees de la facon suivante: <led1>0</led1> <led2>3.5</led2>

Par contre pour remonter simplement ces donnees: Led1 0, led2 3.5 dans ma base sql, je ne comprends pas si une option existe directement dans phpmyadmin pour realiser cela (soit sans code, soit en codant directement dans la page sql de myphpadmin) ou bien si il faut obligatoirement que je passe par un scrip que je devrais faire executer chaque jour par mon nas (de la meme facon que je je l'ai fait pour recuperer le fichier xml regulierement...). Deja si vous pouviez m'orienter vers l'une ou l'autre option, cela m'aiderai grandement...
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719
7 mai 2020 à 14:25
Il te faut un script php ( qui s'exécutera à la suite de ton premier par exemple...) qui va lire ( on dit "parser") le contenu de ton document xml et l'insérer en bdd.
Pour lire un fichier XML, il existe par exemple : SimpleXMLElement
https://www.php.net/manual/fr/simplexml.examples-basic.php
0
Joderic > jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024
Modifié le 11 mai 2020 à 17:03
Bonjour Jordane,

En me basant sur ce que vous m'avez envoye j'ai ecrit le script php suivant que j'ai fait execute par mon nas:
<?php

$sql_serveur = "192.168.1.113:3306"; // SERVEUR SQL

$sql_user = "root";    // NOM UTILISATEUR SQL

$sql_passwd = "Pipxuf@123";   // MOT DE PASSE SQL

$sql_bdd = "domotique";     // NOM DE LA BASE DE DONNEES

$sql_table = "statusxml";   // NOM DE LA TABLE

$connexion = mysqli_connect($sql_serveur, $sql_user, $sql_passwd, $sql_bdd);

if(mysqli_connect_errno($dbconnect)){
echo "Failed to connect";
}
else{
echo "connection successfull";
}


INSERT INTO statusxml (analog1, analog2, analog3, cpt0, date)
SELECT
   MY_XML.response.query('analog1').value('.', 'float'),
   MY_XML.response.query('analog2').value('.', 'float'),
   MY_XML.response.query('analog3').value('.', 'float'),
   MY_XML.response.query('cpt0').value('.', 'float'),
   MY_XML.response.query('date').value('.', 'float'),
   FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK 'volume2:\web\dataipx\status_20200511.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes('response/response') AS MY_XML (response);



mysqli_close($connexion); 

?>

Je recois le message suivant:

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed

0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 110 0 110 0 0 22703 0 --:--:-- --:--:-- --:--:-- 27500

Parse error: syntax error, unexpected 'INTO' (T_STRING) in /volume2/web/dataipx/loaddatabase.php on line 23
Parse error: syntax error, unexpected 'INTO' (T_STRING) in /volume2/web/dataipx/loaddatabase.php on line 23

Idem quand j'essaye de l'executer depuis mon explorer:
Parse error: syntax error, unexpected 'INTO' (T_STRING) in /volume2/web/dataipx/loaddatabase.php on line 23


Est ce que je m'y prends bien?
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719 > Joderic
11 mai 2020 à 17:06
Bonjour,

pour tes prochains messages, pense à utiliser les balises de code ( là, j'ai corrigé ton message pour les mettre).
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Sinon, oui c'est un bon début.
Tu as juste oublié d’exécuter ta requête...
https://www.w3schools.com/php/func_mysqli_query.asp


$sql = "INSERT INTO statusxml (analog1, analog2, analog3, cpt0, date)
SELECT
   MY_XML.response.query('analog1').value('.', 'float'),
   MY_XML.response.query('analog2').value('.', 'float'),
   MY_XML.response.query('analog3').value('.', 'float'),
   MY_XML.response.query('cpt0').value('.', 'float'),
   MY_XML.response.query('date').value('.', 'float'),
   FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK 'volume2:\web\dataipx\status_20200511.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes('response/response') AS MY_XML (response);

";
if (! mysqli_query($connexion,$sql) ){
   echo("Error description: " . mysqli_error($connexion));
}
0
jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024 4 719 > jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024
11 mai 2020 à 17:10
Par contre... pour manipuler ton XML .. je t'ai donné un lien https://www.php.net/manual/fr/simplexml.examples-basic.php
et je ne pense pas qu'il parle du OPENROWSET .... qui, il me semble, n'existe pas en mysql / php
0
Joderic > jordane45 Messages postés 38358 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 28 décembre 2024
13 mai 2020 à 14:44
Bonjour et Merci Jordane,
En effet ca ne fonctionne pas. J'ai change avec du simplexml_load_file:
Sur mon il affiche bien les valeurs du fichier XML que j'ai selectionne mais il le rempli pas la base de donnee...
Pourriez vous me mettre sur une piste?

<code php><
<?php
$xml = simplexml_load_file("status_20200510.xml");
{
$analog1 = $xml->analog1;
$analog2 = $xml->analog2;
$response3 = $xml->analog3;
$response4 = $xml->cpt0;
$response5 = $xml->date;


$html .= "<p>$analog1</p>";
$html .= "<p>$analog2</p>";
$html .= "<p>$response3</p>";
$html .= "<p>$response4</p>";
$html .= "<p>$response5</p>";
}

echo $html;


$sql_serveur = "192.168.1.113:3306"; // SERVEUR SQL

$sql_user = "root"; // NOM UTILISATEUR SQL

$sql_passwd = "Pipxuf@123"; // MOT DE PASSE SQL

$sql_bdd = "domotique"; // NOM DE LA BASE DE DONNEES

$sql_table = "statusxml"; // NOM DE LA TABLE

$connexion = mysqli_connect($sql_serveur, $sql_user, $sql_passwd, $sql_bdd);

if(mysqli_connect_errno($dbconnect)){
echo "Failed to connect";
}
else{
echo "connection successfull";
}

$sql = "INSERT INTO statusxml (analog1, analog2, analog3, cpt0, date) values (\"$analog1\",\"$analog2\",\"$analog3\",\"$cpt0\",\"$date\")";


mysqli_close($connexion);

?>
>
0