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

Langage PHP Discussion :

Alimenter une base SQL à partir d'un fichier XML


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Alimenter une base SQL à partir d'un fichier XML
    Bonjour à tous,

    Déjà, n'étant pas un habitué du forum, j'espère ne pas me tromper de rubrique. Pour vous donner une idée de mon niveau, je maitrise HTML / CSS, je suis novice en PhP / MySqL et XML m'est complètement inconnu.


    Mon objectif
    Commençons par le commencement, je vous explique ce que je souhaite faire.
    Aujourd'hui, un de mes prestataires génère un flux XML (exemple de flux généré plus bas), afin d'alimenter mon site en petites annonces. Ce flux est mis à jour chaque soir à heure fixe.

    Dans mon idée, mon travail passe par deux étapes :
    1. Alimenter automatiquement la base SqL à partir du fichier XML.
    2. Générer les pages à partir de la base SqL (ce qui n'est pas l'objet de ce post, un problème à la fois).


    Où j'en suis
    Travaillant sur un autre projet en parallèle, je n'ai pas beaucoup avancé.

    Reprenons : le fichier XML que l'on me donne est sous cette forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
    <adapt_xml>
      <annonce>
      <reference>00000</reference>
      <date>20080102</date>
      <titre_fr>Titre de l'annonce</titre_fr> 
      </annonce>
    </adapt_xml>
    Pour récupérer ces données dans une base SqL, je me suis axé sur des éléments trouvés en fouinant sur la toile. A priori - si j'ai bien saisi - il y a plusieurs méthodes (DOM, simplexml, ...). Le simplexml à l'air de bien porter son nom : voilà où j'en suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?
    $data = simplexml_load_file("url/fichier.xml");
    $ref = $data->annonce[0]->reference; 
    $dat = $data->annonce[0]->date;
    $tit = $data->annonce[0]->titre_fr;
     
    $sql= "INSERT 	INTO 'annonces' ('REFERENCE', 'DATE', 'TITRE_FR')
    				VALUES ($ref , $dat, $tit)
    	  ";
    mysql_query ($sql);
    ?>
    Ca marche pas exactement tip top (parfois, les données ne s'upoload pas, mais en me creusant la tête, je devrais comprendre d'où vient le problème. D'ailleurs, je m'interroge également, je dois plutôt utiliser INSERT ou UPDATE ?

    Là où je bloque

    1 - Que le script fonctionne automatiquement : là, je dois visiter une page pour que le script s'active. J'aimerai qu'il s'active automatiquement, et ne gène pas le chargement des pages. Si je le laisse en l'état, il va aller aspirer le flux à chaque requête de visiteur, et le serveur risque de souffrir (arrêtez moi si je dis une ânerie).
    => Que rajouter pour automatiser le script.
    => Où placer cette "page" sur mon site (à la racine /WWW ?).

    2 - Parser convenablement le flux XML. Je pense que je vais devoir faire une boucle, mais je ne vois pas exactement quelle syntaxe utiliser. En effet, en l'état, le fichier XML de test ne comporte qu'une annonce. Mais à l'avenir, il va en contenir plusieurs. Du coup, il me faut un script qui rajoute toutes les annonces, qu'il y en ai 1 ou 25.
    => Quelle serait la syntaxe pour rendre le script souple en fonction du nombre d'annonce.


    Bon, vous l'aurez compris, je nage et je bricole. Pour autant, je n'attends pas spécialement le script tout fait : des pistes ou des confirmations que je suis sur la bonne route me seront déjà forts utiles.

    Merci d'avance

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Alors déjà, il te faut un identifiant unique pour tes annonces (par exemple ton champ référence)
    Pour savoir si tu dois faire une insertion (INSERT) ou une mise à jour (UPDATE), il faut que tu commences par vérifier si l'annonce existe déjà en base en cherchant l'enregistrement à partir de l'identifiant. Évidemment, si ton xml ne contient que des nouvelles annonces, tu peux faire directement l'insertion.

    Pour l'automatisation, il va te falloir une tache planifiée qui tournera à heure fixe. http://matthieu.developpez.com/execution_periodique/

    Pour la boucle, en supposant que ton fichier XML soit une succession d'annonces de cette forme :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?xml version="1.0" encoding="ISO-8859-1" ?> 
    <adapt_xml>
      <annonce>
      <reference>00001</reference>
      <date>20080102</date>
      <titre_fr>Titre de la premiere annonce</titre_fr> 
      </annonce>
      <annonce>
      <reference>00002</reference>
      <date>20080102</date>
      <titre_fr>Titre de la deuxieme annonce</titre_fr> 
      </annonce>
    </adapt_xml>
    tu peux boucler sur les annonces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $data = simplexml_load_file("url/fichier.xml");
    foreach ($data->annonce as $annonce) {
    	$ref = $annonce->reference; 
    	$dat = $annonce->date;
    	$tit = $annonce->titre_fr;
    	//....
    }

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup.

    Ca me donne une très bonne base pour avancer ce soir. Je reviens vers vous si je bloque bientôt

    EDIT DU SOIR :

    Code : 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
     
    <?
    $data = simplexml_load_file("http://ns366377.ovh.net/~lecomte/test_xml/annonce.xml");
    foreach ($data->annonce as $annonce) {
    	$ref = $annonce->reference; 
    	$dat = $annonce->date_creation;
    	$tit = $annonce->titre_fr;
    	//....
     
    	$sql = "SELECT * FROM annonces WHERE annonce_ref='$ref'";
    	$valeur = mysql_query($sql);
    	if (mysql_affected_rows()==0)
    	{
    		$ajout= " 	INSERT
    					INTO annonces (annonce_ref, annonce_date_creation, annonce_titre)
    					VALUES ('$ref', '$dat', '$tit')
    				";
    		mysql_query ($ajout);
    	}
    	else
    	{	
    		$modif= " 	UPDATE annonces
    					SET annonce_titre='$tit', annonce_date_creation='$dat'
    					WHERE annonce_ref='$ref'
    					
    				";
    		mysql_query ($modif);
    	}
     
    }
    ?>
    Je suis vraiment une quiche, mais j'ai réussi à alimenter ma base SQL depuis le flux XML. En gros, le déroulé :
    On lit le formulaire ligne par ligne => pour chacune, on récupère les valeurs de chaque champs => on check la table existante => si la valeur pour "référence" de la ligne XML n'est pas dans la table SQL, on ajoute tous les champs qui lui sont associés => sinon, on modifie tous les champs ...

    Quelqu'un peut me confirmer que ce code est propre ? Car même si il marche, il est sorti de mon petit cerveau musclé, ce qui n'est pas toujours un gage de qualité.

    Me reste plus qu'à automatiser l'envoie grâce à ton lien, faut que je m'y penche.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Attention mysql_affected_rows indique le nombre de lignes affectées par la dernière requête de modification (genre insert, update, delete...) et pas de sélection. Il vaudrait mieux utiliser mysql_num_rows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql = "SELECT * FROM annonces WHERE annonce_ref='$ref'";
    $valeur = mysql_query($sql);
    if (mysql_num_rows($valeur)==0)
    Mais à part ça c'est correct

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Très bien, merci.

    J'en profite, vu que j'apprends : grossomodo (si je comprends bien), affected_rows sert aux requêtes type "traitement" tandis que num_rows est utilisée pour les requêtes de type "consultation" ?

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par Pfaal Voir le message
    affected_rows sert aux requêtes type "traitement" tandis que num_rows est utilisée pour les requêtes de type "consultation" ?
    C'est bien ça

    A noter que l'extension mysql_ est vouée à disparaitre, au profit de mysqli (ou PDO)
    :arrow : API pour Mysql

Discussions similaires

  1. Alimenter une base de données avec des fichiers xml
    Par anaas dans le forum Administration
    Réponses: 2
    Dernier message: 16/07/2012, 11h02
  2. Réponses: 0
    Dernier message: 15/07/2009, 16h23
  3. [SQL] Remplir une base SQL à partir d'un tableau à plusieurs lignes et colonnes
    Par Yagami_Raito dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 13/08/2007, 08h56
  4. Réponses: 1
    Dernier message: 06/08/2007, 10h39
  5. erreur de connection sur une base sql à partir de vb6
    Par diatta dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 27/04/2007, 13h12

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