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 :

Insérer données XML dans Mysql avec script récurrent PHP5 via "LOAD XML LOCAL INFILE","for $xml->children()"


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 15
    Points
    15
    Par défaut Insérer données XML dans Mysql avec script récurrent PHP5 via "LOAD XML LOCAL INFILE","for $xml->children()"
    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
    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);
    }
    ?>
    Je poste cette portion de code pour reçevoir toutes critique constructive
    voici le code pour la consommation de Web Service.
    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
    ?>
    Exemple de retour XML toujours formaté de la même façon (indenté par mes soins pour plus de lisibilité)
    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...
    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
    ?>
    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...
    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

  2. #2
    Membre à l'essai
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de base de données

    Informations forums :
    Inscription : Novembre 2011
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Bonjour

    afin de préciser m'a demande:

    J'ai un fichier contenant des information d'une table en XML:
    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>
            <Record id= "Etc..."
    </Records>
    Je souhaite connaitre la correcte syntaxe en PHP / Mysql de la fonction load xml infile adapté à mon fichier :
    voici les parti obscure des options:
    LOAD XML (ok)
    [LOW_PRIORITY | CONCURRENT] [LOCAL] (Je ne sais pas)
    INFILE 'xml.xml' (ok)
    [REPLACE | IGNORE] ()
    INTO TABLE [db_name.]tbl_name (ok)
    [CHARACTER SET charset_name] (ok)
    [ROWS IDENTIFIED BY '<tagname>'] ('<Field' ne fonctionne pas)
    [IGNORE number [LINES | ROWS]] (je pense en avoir besoin pour ignorer tous les '<Accounts><Account id="1126"/></Accounts>' )
    [(column_or_user_var,...)](Je ne sais pas)
    [SET col_name = expr,...](je ne sais pas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    $sql="load xml infile 'xml.xml' REPLACE INTO TABLE ".$result['Table_NOM']." CHARACTER SET UTF-8 ";
    echo '<pre> $sql: ' . htmlspecialchars(print_r($sql, true)) . '</pre>';
    $bdd->execute($sql);
    Affiche:
    $sql: LOAD XML INFILE `xml.xml` REPLACE INTO TABLE XXXX CHARACTER SET UTF-8

    Erreur : SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`xml.xml` REPLACE INTO TABLE XXXX CHARACTER SET UTF-8' at line 1

    Dans mon code j'ai vérifié la valeur de $result['Table_NOM'] qui est correcte.

    J'espère que quelqu'un pourra m'aider, m'expliquer, me donner un lien documenté. Merci d'avance

Discussions similaires

  1. Injecter automatiquement du xml dans Mysql avec php
    Par Max1000p dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 04/06/2012, 10h44
  2. Réponses: 3
    Dernier message: 10/04/2010, 11h19
  3. [MySQL] Insérer un vecteur dans MySQL avec PHP
    Par fAdoua123 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 21/02/2008, 17h50
  4. Incapable d'insérer dans MySQL avec JDBC
    Par guillo14 dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/06/2006, 01h26
  5. Comment stocker PROPREMENT "\\" dans mysql avec p
    Par jcachico dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 03/12/2005, 14h32

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