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/02/2012, 10h24   #1
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
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.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h32   #2
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
On peut voir le code ?
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h38   #3
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
Je vais essayer de faire simple. Je vous épargne les fonctions du parser.

Le code du parser :
Code :
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 :
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.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h43   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 244
Points : 8 629
Points : 8 629
pourquoi t'utilise pas SimpleXML ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h40   #5
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
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.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 11h55   #6
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
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 :
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 12h02   #7
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 13h21   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 244
Points : 8 629
Points : 8 629
Citation:
Envoyé par Freedolphin Voir le message
Parce que je ne suis pas sous PHP5.
Ah bon, t'es chez quel hébergeur ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 17h13   #9
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
@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.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 17h36   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 244
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 244
Points : 8 629
Points : 8 629
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
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 17h39   #11
Membre actif
 
Homme
Inscription : avril 2011
Messages : 426
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : avril 2011
Messages : 426
Points : 171
Points : 171
Étonnant, je l'utilise SimpleXml chez 1&1 depuis deux ans au moins
heretik25 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 08h41   #12
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
Citation:
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 :
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 09h15   #13
Membre du Club
 
Avatar de Freedolphin
 
Inscription : février 2006
Messages : 145
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 145
Points : 47
Points : 47
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.
Freedolphin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h53   #14
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 738
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 738
Points : 3 310
Points : 3 310
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]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h38.


 
 
 
 
Partenaires

Hébergement Web