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 07/12/2011, 13h19   #1
Candidat au titre de Membre du Club
 
Homme
Inscription : novembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : novembre 2011
Messages : 13
Points : 12
Points : 12
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 :
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 :
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 :
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 :
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 :
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
Chaftcbr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2011, 16h57   #2
Candidat au titre de Membre du Club
 
Homme
Inscription : novembre 2011
Messages : 13
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : novembre 2011
Messages : 13
Points : 12
Points : 12
Bonjour

afin de préciser m'a demande:

J'ai un fichier contenant des information d'une table en XML:
Code XML :
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 :
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
Chaftcbr 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 18h24.


 
 
 
 
Partenaires

Hébergement Web