Bonjour,
Je dois publier un site permettant de télécharger des documents type tableur (xls, csv ou autres), ceux-ci contenant des informations qui sont dans une base de donnée distante accessible via Web service.
Ces données évoluent tous les jours. J'ai décider ce séparer la création des documents téléchargeables et la récupération des données.
1) Récupérer les données, pour plus de sécurité j'ai décidé de créer sur mon serveur une base de donné identique et de "copier" les donnée deux fois par jour.
La BDD distante via les Web services me transmet des STDobject contenant du XML avec les données d'une table partie fonctionnel voir code ci-dessous:
Fonction pour accéder à la BDD distante (DALYO) avec WEB Service
Je poste cette portion de code pour reçevoir toutes critique constructive
Code php : 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 <?php function WSQuery ($appId, $queryXml, $login, $password, $tableId) { try { // création du client $client_ws = new SoapClient('http://dalyo.com/server/services/Data?wsdl',array( 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP, 'soap_version' => SOAP_1_1, 'encoding' => 'utf-8', 'trace' => 1, 'exceptions' => false, 'features' => SOAP_SINGLE_ELEMENT_ARRAYS, )); $params = array('request' => array( 'appId' => $appId, 'queryXml' => $queryXml, 'login' => $login, 'password' => $password, 'tableId' => $tableId ) ); // appel du service $retour_ws = $client_ws->WS_Query($params); } catch (Exception $e) { die('<pre>' . htmlspecialchars($e) . '</pre>'); return(FALSE); } return ($retour_ws); } ?>
voici le code pour la consommation de Web Service.
Exemple de retour XML toujours formaté de la même façon (indenté par mes soins pour plus de lisibilité)
Code php : 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 <?php try { error_reporting(-1); ini_set('display_errors', 1); include 'fonction.php'; // Connection à MySQL $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION; $bdd = new PDO('mysql:host=localhost;dbname=abc', 'root', '', $pdo_options); // on crée la requête SQL pour récup les table_ID qui sont stocké en local et référence les tables distantes $reponse = $bdd->query('SELECT Table_ID FROM liaison_tpzf'); // on boucle sur chaque table_ID une à une pour effectuer la copie de chacune //while ($tableID = $reponse->fetch()) //{ $tableID['Table_ID']= 0;// Pour le test je le fait sur une seule table //echo '<pre> ID de la table: $tableID[\'Table_ID\']= ' .$tableID['Table_ID'] . '</pre>';// Affichage table_ID //récupération de "Table_NOM" en fonction de"Table_ID" $Table_NOM = $bdd->prepare('SELECT Table_NOM FROM liaison_tpzf WHERE Table_ID = :tableid'); $Table_NOM->execute(array('tableid' =>$tableID['Table_ID'])); //Récupération des noms des tables un par un $result = $Table_NOM->fetch(); //echo '<pre> Nom de la table: $result[\'Table_NOM\']= ' . htmlspecialchars(print_r($result['Table_NOM'], true)) . '</pre>';// affiche le Nom de la table pointé par le Table ID //récupération des nouveaux éléments de la table 'Table_ID'(Bdd distante) à insérer dans 'Table_NOM'(TPZF) $date = '2009-09-20T12:00:00+0100'; $queryXml ='<Query><Select all="true"/><Meta><TimeFrame><DateTime keyword="after" include="true">'.$date.'</DateTime></TimeFrame></Meta></Query>'; $queryXml ='<Query><Select all="true"/></Query>'; $retour_ws= WSQuery(1234,$queryXml,"XXXX","XXXX",$tableID['Table_ID']); //echo '<pre> Retour WSQuery :$retour_ws= ' . htmlspecialchars(print_r($retour_ws, true)) . '</pre>'; //affiche le Retour WSQuery : $retour_ws //echo '<pre> Retour WSQuery :$retour_ws= ' . htmlspecialchars(print_r($retour_ws->return->outputXml, true)) . '</pre>'; //affiche l'XML retourné : $retour_ws->return->outputXml //Convertir outputXml en simplexml_ $xml = $retour_ws->return->outputXml; $simplexml = simplexml_load_string($xml); //echo '<pre> Retour WSQuery :$retour_ws= ' . htmlspecialchars(print_r($simplexml, true)) . '</pre>'; //affiche l'simplexml //Récupère les enregisterment $Table_NB_COL de la table liaison_tpzf. $Table_NB_COL = $bdd->prepare('SELECT Table_NB_COL FROM liaison_tpzf WHERE Table_ID = :tableid'); $Table_NB_COL->execute(array('tableid' => $tableID['Table_ID'])); //Récupère le premier enregistrement du jeu de résultats associé à l'objet PDOStatement $Table_NB_COL.) $NB_COL= $Table_NB_COL->fetch(); //echo '<pre> $NB_COL[\'"Table_NB_COL\']:' . htmlspecialchars(print_r($NB_COL['Table_NB_COL'], true)) . '</pre>';// affiche le nombre de colone de la table référencé par Table_ID ?>
Code xml : 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 <?xml version="1.0" encoding="UTF-8"?> <Records> <Record id="1" date="2010-10-08" time="12:20:14"> <Data> <Field id="10" name="ID">1</Field> <Field id="11" name="NOM">Pomme</Field> <Field id="43" name="ID_TYPE_CULTURE">3</Field> </Data> <Accounts><Account id="1126"/></Accounts> </Record> <Record id="2" date="2010-10-08" time="12:20:14"> <Data> <Field id="10" name="ID">2</Field> <Field id="11" name="NOM">Colza</Field> <Field id="43" name="ID_TYPE_CULTURE">1</Field> </Data> <Accounts><Account id="1126"/></Accounts> </Record> </Records>
Voila mon problème insérer ces données XML dans mas BDD (MySql)
J'arrive à cibler chaque valeurs et attribues via deux "foreach" imbriqué" mais je n'ai pas encore trouver comment les insérer car le nombre de champ(Field) est variable selon les tables.
Un case sur le nombre de colonne avec for et insert adapté à chaque fois.... long et ne permet pas beaucoup dévolution à la BDD.
J'ai donc regardé du coté du LOAD XML INTOFILE mais la il se passe rien..(donc pas de message d'erreur.voir code...
avec LOAD XML INFILE mon fichier est bien présent et est modifié mais lors de l'importation il n'y a pas d'erreur , mais rien dans ma BDD...
Code php : 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 //Pour chaque enregistrement de la variable XML foreach ($simplexml->Record as $record) { //initialisation des variables $val= array(); $row = 0; echo '<pre>Valeur $row :' . $row . '</pre>'; //Pour chaque champ je récupère la valeur dans ($field) et je l'insère dans la table($result['Table_NOM']) dans le champ ($field['name']) foreach ($record->Data->Field as $field) { $val["Nom_COL"][$row] = $field['name']; // préparation de l'array pour le test suivant $val["Valeur"][$row] = $field; $row = $row+1; }// end foreach ($record->Data->Field as $field) echo '<pre>Valeur $val :' . htmlspecialchars(print_r($val, true)) . '</pre>'; foreach ( $val["Nom_COL"] as $Num_COL => $Nom_COL) { $INSERT = $bdd->prepare(' INSERT INTO :Table_NOM VALUES (:valeur1,valeur2,valeur3, etc.....)'); $INSERT->execute(array( ':Table_NOM' => $result['Table_NOM'], ':valeur1' => $val[1][0], ':valeur2' => $val[1][1], ':valeur3' => $val[1][2], ':valeur4' => $val[1][3], ));// Trop statique à mon gout }//end foreach ( $val["Nom_COL"] as $Num_COL => $Nom_COL) } //end foreach ($simplexml->Record as $record) $reponse->closeCursor(); // Termine le traitement de la requête //}//while ($tableID = $reponse->fetch()) }//end Try catch(Exception $e) { die('Erreur : '.$e->getMessage()); // En cas d'erreur précédemment, on affiche un message et on arrête tout }//end catch ?>
si je rajoute LOAD XML LOCAL INFILE l'erreur est : **forbidden**
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 filename = "\\X\X\xml.xml"; echo '<pre> $filename= ' . htmlspecialchars(print_r($filename, true)) . '</pre>'; $handle = fopen($filename, 'w'); fwrite($handle, $xml); fclose($handle); // On importe tout ça dans la BDD $sql="load xml infile 'xml.xml' INTO TABLE ".$result['Table_NOM']." "; //je ne trouve pas la syntaxe pour ma balise ROWS IDENTIFIED BY '<Field?'; echo '<pre> $sql: ' . htmlspecialchars(print_r($sql, true)) . '</pre>'; $INSERT = $bdd->prepare($sql); $INSERT->execute();
Je suis ouvert à toutes aide car je suis débutant en PHP & SGBD et je met beaucoup trop de temps à faire ce site...
2)Je vais commencer m'attaquer au problèmes des extractions des données de ma future BDD dans fichier type tableur téléchargable.
Je remercie d'avance toutes les personnes qui aurrons pris le temps de lire ce post et bénie toute l'aide que vous m'apporterez.
Mikaël VIGIER <=> Chaftcbr
Partager