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 :

Remplir une table avec un fichier XML [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut Remplir une table avec un fichier XML
    Bonjour à tous,

    J'essaie actuellement d'intégrer à ma base de données le contenu d'un flux XML.
    J'ai donc un script qui me permet de parser le fichier mais au lieu de lire les données, je les insère à ma BDD.

    Problème : sur les 700 entrées, seulement 260 sont ajoutées à la table.
    Chose étrange, j'ai mis un echo après chaque requête en insert, et il m'affiche bien les 700 entrées.

    Quelqu'un a-t-il une idée sur ce phénomène ? Merci d'avance.
    Le mieux n'est pas forcément l'ennemi du bien.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    On peut voir le code ?

  3. #3
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Je vais essayer de faire simple. Je vous épargne les fonctions du parser.

    Le code du parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	$parser = new XML_Parser();
    	$parser->xml_file = $fichier;
    	$parser->load();
    	$racine = $parser->documentElement();
    	$livres = $racine->getElementsByTagName('PRODUCT');
    L'insertion :
    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
     
    	foreach($livres->tag_array as $livre)
    	{
    		$category = $livre->getDataItem(12);
    		$category = utf8_decode($category);
    		$id = $livre->getDataItem(0);
    		$name = $livre->getDataItem(4);
    		$price = $livre->getDataItem(18);
    		$pricenorebate = $livre->getDataItem(28);
    		$url_produit = $livre->getDataItem(8);
    		$url_image = $livre->getDataItem(9);
    		$description = $livre->getDataItem(10);
    		$description = utf8_decode($description);
     
    		$requete = "INSERT INTO catalogue (id,nom,description,url_image,url_produit,price,pricenopromo,categorie) VALUES";
    			$requete .="('$id','$name','$description','$url_image','$url_produit','$price','$pricenorebate','$category')";
    			$resultat = mysql_query($requete);
    			echo "$name : ajouté<hr>";
    	}
    	//$parser->destroy();
    Sachant que le problème est identique avec un autre script de parser.
    Le mieux n'est pas forcément l'ennemi du bien.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    pourquoi t'utilise pas SimpleXML ?

  5. #5
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Parce que je ne suis pas sous PHP5.

    Problème résolu, cependant : j'ai lancé une visualisation des erreurs Sql et il y avait des champs avec apostrophes qui interrompaient la requête.
    J'ai ajouté la fonction htmlspecialchars à la variable du champs concerné et tout est rentré dans l'ordre.
    Le mieux n'est pas forcément l'ennemi du bien.

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Il faudrait obtenir le nombre de résultat qu'a normalement effectué la requête, avec la fonction mysql_affected_rows()

    Faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $requete = "INSERT INTO ...";
    $resultat = mysql_query($requete);
    if ($resultat) {
        echo $name.' : ajouté | effectué : '.mysql_affected_rows($resultat);
    }
    else {
        echo 'Erreur sur : '.$name;
    }
    echo '<hr>';
    Normalement mysql_affected_rows() devrait retourner 1 pour chaque insertion.
    Si ce n'est pas le cas, alors il doit avoir une erreur.
    Faudrait alors faire un mysql_error(), ou activer l'affichage des erreurs de MySQL (php.ini -> mysql.trace_mode à On) pour en savoir un peu plus.


    A coté de ça, tu prends apparemment aucune précaution sur les données que tu insert.
    Si un ID n'a aucune valeur par exemple alors que c'est la clé primaire, ça va théoriquement planter.
    Ca peu être le cas sur d'autres données qui pourrait être non conformes.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    J'ai ajouté la fonction htmlspecialchars à la variable du champs concerné et tout est rentré dans l'ordre.
    Ce n'est pas htmlspecialchars() qu'il faudrait faire normalement, mais plutôt : mysql_real_escape_string().
    C'est un problème d'échappement de certains caractère comme les '.
    Cette fonction protège aussi contre des éventuels injections SQL.

    Les remplacer par des entités HTML ce n'est pas ce qui à de mieux.
    Théoriquement il vaut mieux conserver des données brut dans la Bdd, et mettre des entités Html que dans les pages Html.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Freedolphin Voir le message
    Parce que je ne suis pas sous PHP5.
    Ah bon, t'es chez quel hébergeur ?

  9. #9
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    @RunCodePhp
    C'est effectivement en faisant un mysql_error() que j'ai compris d'où venait l'erreur, un problème d'apostrophe dans une donnée.
    Concernant les précautions sur les données, l'ID est celle du produit dans le flux initial, pas celle de l'objet inséré dans la base, il a son propre identifiant avec clé primaire.

    Je retiens ton idée pour mysql_real_escape_string(), je l'utilise pour les insertions de données via des formulaires sur site, pas dans des admin sécurisées. Mais ce sera surement plus propre.

    @stealth35
    Je suis chez 1&1 et à chaque fois que j'utilise SimpleXML, j'ai une erreur.
    Le mieux n'est pas forcément l'ennemi du bien.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Freedolphin Voir le message
    @stealth35
    Je suis chez 1&1 et à chaque fois que j'utilise SimpleXML, j'ai une erreur.
    http://faq.1and1.fr/scripts/php/5.html

  11. #11
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Étonnant, je l'utilise SimpleXml chez 1&1 depuis deux ans au moins

  12. #12
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Je retiens ton idée pour mysql_real_escape_string(), je l'utilise pour les insertions de données via des formulaires sur site, pas dans des admin sécurisées. Mais ce sera surement plus propre.
    Oui certainement.
    Cette fonction n'a pas juste pour mission de sécuriser, mais de faire en sorte d'échapper certains caractères afin que l'opération (insertion, mise à jour, etc ...) se fasse sans "plantage".
    Le faire systématiquement dans ce cadre là (au niveau de la Bdd) rendra plus stable ton code (admin ou pas).

    Ou alors, si le type de donné est connu, comme un entier, un float, un booléen, on peu caster cette donnée, c'est à mon sens plus efficace/radical que cette fonction.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $un_entier = (int)$_POST['un_entier'];
    $un_bool = (bool)$_POST['un_bool'];
    Disons que cette fonction est nécessaire sur des chaines de caractères.

    Mise à par ça, évoluer vers PDO ou MySQLi en utilisant des requêtes préparées serait pas mal non plus, car les fonctions mysql_truc_muche(), c'est obsolète, faut le savoir.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  13. #13
    Membre actif
    Avatar de Freedolphin
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Février 2006
    Messages : 291
    Points : 225
    Points
    225
    Par défaut
    Merci RunCodePhp pour ces précisions.
    Quant au passage à la POO (c'est bien ça dont tu parles ?), il va falloir que je m'y mette mais ça ne va pas se faire en 2 jours...
    Le mieux n'est pas forcément l'ennemi du bien.

  14. #14
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par Freedolphin
    Quant au passage à la POO (c'est bien ça dont tu parles ?), il va falloir que je m'y mette mais ça ne va pas se faire en 2 jours...
    Non, je sais très bien que la POO ça ne s'apprend pas en quelques jours (ça prend des années).

    On peu exploiter une classe (comme PDO) dans un contexte procédural (de manière classique).
    Il faut quand même un apprentissage du comment l'exploiter, au même titre quand on découvre une nouvelle fonction, c'est tout.

    Il y a des exemple de codes dans la doc :
    -> connexion à la base
    -> Une requête SQL (un SELECT) avec une requête préparée avec bindValue
    Le forum PDO qui permet d'avoir pas mal d'exemples de code.
    Et un tuto pour comprendre PDO

    Il faut s'accorder un peu de temps, ça c'est sûr.

    Il y a moyen de passer en douceur à PDO (Il faut Php5 cependant)
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplir une table avec un fichier .YML (YAML) dans MySQL
    Par gsaly dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 14/10/2009, 11h48
  2. remplir une BD avec un fichier XML
    Par scaryfan dans le forum XQUERY/SGBD
    Réponses: 2
    Dernier message: 12/05/2009, 20h51
  3. [SQL] Comment un remplir une table avec un fichier xls
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 21/10/2006, 12h33
  4. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46

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