Création bdd à partir d'un fichier XML

kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009 - 8 déc. 2009 à 22:23
 sahouma34 - 25 janv. 2010 à 22:24
Bonjour,

Je souhaite créer ma base de donnée ( création des tables + remplissage des champs ) à partir d'un fichier XML qui pourra être modifié.

C'est le seul point noir de mon projet de commerce électronique.

Merci d'avance pour vos idées.

34 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
8 déc. 2009 à 22:49
Salut,

Que souhaites-tu faire précisément ? Pourquoi le fichier xml doit-il pouvoir être modifié ? Pour recréer la base, la modifier... ?
Sinon, qu'est-ce qui te bloque exactement ? C'est en fait une manière de demander ce que tu demandes :) Parce que là, en l'état, je ne vois pas bien quel genre de réponse tu attends, comment on peut t'aider...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
8 déc. 2009 à 23:31
En fait je veux créer un site internet de commerce élécronique où les données sont complètement séparées du code php.

L'idée c'est donc de décrire les produits avec leur appartenance à des rubriques dans un fichier XML

Un produit peur avoir différents attributs par exemple libelle, descriptif, prix, unité de vente etc... C'est différents attributs ne sont pas forcement toujours les mêmes.

La lecture de ce fichier doit donc me permettre de créer les tables MySQL produits, rubriques, etc... et de les remplir.

En fait je veux pouvoir tester mon site internet avec n'importe quel genre d'objet qui sera vendu sur mon site.

Le seul problème c'est que je ne vois pas comment me servir du XML en utilisant PHP5.

J'espère que j'ai réussi a mieux définir le problème...
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 00:09
Euh non, pas vraiment... :/
Je ne vois pas en quoi le fait que les attributs (caractéristiques ?) puissent varier d'un produit à l'autre t'oblige à créer de nouvelles tables en fonction des produits. Si la base est correctement conçue, il doit être possible de gérer des produits avec des caractéristiques très variées, même si elles ne sont pas les mêmes pour tous les produits, et ce sans créer de nouvelle table.
Les tables d'une base de données ne doivent JAMAIS (c'est un principe fondamental de l'administration de base de données, de conception et d'analyse dans un projet) être créées ou modifiées par le programme. JAMAIS. C'est mal. Si tel devait être le cas, alors l'application serait mal conçue.
Création/modification/suppression de tables dans une base sont des opérations d'administration. Une table peut être modifiée si besoin est pour suivre l'évolution du programme, certes, mais pas pour gérer un nouveau produit.
Bon j'arrête là mon speech.

Peux-tu être plus précis quant aux attributs des produits en question ? Peux-tu donner des exemples ? A partir de là, on verra comment il est possible de faire une base qui n'a pas à être modifiée pour accueillir de nouveaux produits (parce que c'est forcément faisable, mais il me faut plus d'informations).

Quand tu dis :
je veux pouvoir tester mon site internet avec n'importe quel genre d'objet qui sera vendu sur mon site.

Est-ce que tu veux dire que tu ne sais pas encore quel genre de produit tu vas vendre ? Même ça ce n'est pas un obstacle : une application eCommerce permet de gérer quasiment n'importe quel produit, il suffit de voir que des solutions comme OSCommerce, Plici, Prestashop ou autre ne demandent pas de recréer la base de données pour permettre de vendre à peu près tout et n'importe quoi.

Je te garantis qu'il existe des solutions pour ne pas avoir à s'emmerder à créer de nouvelles tables pour gérer tel nouveau produit qui a des caractéristiques qui lui sont propres : j'ai bien une idée en tête, mais j'aimerais avoir plus de détails pour être sûr que je suis dans le bon.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 00:24
En fait, j'ai déjà ma table produit avec des champs fixes

-id_produit
-libelle
-descriptif
-prix
-unite de vente

Ces attributs du produit seront obligatoires dans mon fichier XML, cependant il pourra y avoir des champs optionnels supplémentaires comme :
- image
- année
- marque

Mon prof de Web va donc entrer son fichier XML pour tester si mon site est suffisament générique. Ici ca ne correspond biensur pas à la réalité car si j'avais un vrai site à faire je saurais pour quel produits je le fais ^^

Les produits peuvent a partir a plusieurs rubriques : p.e une fourchette peut faire parti de la rubrique cuisine comme déco ( c'est un exemple )

Via l'interface admin de mon site je dois donc pouvoir créer les tables produits, rubriques et rubriques_produit dynamiquement en fonction des informations présentes dans le fichier XML.

Mon problème est donc: comment lire le fichier XML pour créer les tables avec les bons champs et ensuite remplir ces tables. Je n'ai que le droit d'utiliser AJAX, Javascript, PHP et MySQL

J'espère avoir été un peu plus clair
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 00:52
Ca confirme ce que je pensais. Il ne faut pas faire comme ça, ce serait une erreur d'analyse.
Quand je parle d'admin, je ne parle pas d'administration du site, mais de la base de données. Ce sont deux choses différentes : l'admin du site correspond au fonctionnement normal de l'application, à l'intérieur duquel la base ne DOIT PAS être modifiée (sous aucun prétexte), alors que l'administration de la base de données correspond à une phase de développement ou de maintenance de l'application (mais pas du site), dans laquelle la modification de la base de données est possible, puisque s'intégrant dans un processus d'amélioration de l'application.

Ce que tu dois faire, c'est considérer les attributs de tes produits comme des données que tu associes à chaque produit. C'est la relation attribut-produit qui détermine si le produit possède tel ou tel attribut.

Définissons une table produits basique comme celle que tu as décrite :
PRODUITS
- produit_id
- produit_libelle
- produit_descriptif
- produit_prix
- produit_unite

Définissons maintenant ce qu'est un attribut :
ATTRIBUTS
- attribut_id
- attribut_nom

C'est à peu près tout. Un attribut, en lui-même, n'est pas besucoup plus que ça.

Si tu vends des claviers d'ordinateur, tu as besoin d'indiquer des caractéristiques qui ne sont pas communes à tous les produits, comme par exemple :
- marque
- connectique
- multimédia

Tu vas insérer de nouveaux enregistrements dans la table attributs. Bien. Maintenant, pour savoir quel produit possède quel attribut, il faut faire une relation entre les deux. Cette relation permet donc de définir quel attribut possède un produit : elle doit nécessairement indiquer la valeur de l'attribut. En analyse, on appelle ça une propriété portée, et la relation attribut-produit est une relation n,n : un même produit peut avoir plusieurs attributs, un même attribut peut être associé à plusieurs produits. Concrètement, dans un MLD (Modèle logique de Données dans la méthode Merise), la relation attribut-produit est représentée comme ceci :
ATTRIBUT-PRODUIT
- attribut_id
- produit_id
- attr_valeur
La clé primaire étant la concaténation des deux ID attribut_id et produit_id

Reprenons l'exemple des claviers. Dans la table produits, on aurait quelque chose comme ça :
produit_id produit_libelle produit_descriptif produit_prix produit_unite
1 Clavier 105T Logitech Blabla du clavier génial 30 -
2 Clavier Sans Fil Blabla multimédia tout ça 60 -
3 Clavier lumineux Luminosité réglable blabla 80 -

Dans la tabe attributs, on aurait :
attribut_id attribut_nom
1 marque
2 connectique
3 multimedia

Enfin, la table matérialisant la relation attribut-produit comporterait :
attribut_id produit_id attr_valeur
1 1 Logitech
2 1 USB
3 1 Non
1 2 Microsoft
2 2 Sans fil
3 2 Oui
1 3 Logitech
2 3 USB
3 3 Oui

Lorsque tu récupères les informations sur un produit, une jointure sur la table de relation et la table attributs te permet de récupérer par la même occasion les différents attributs spécifiques à ce produit ainsi que sa valeur (marque Logitech, connectique USB, etc).

Cela rend ta base de données suffisament générique pour pouvoir gérer n'importe quel type de produit. Si la relation entre un produit et un attribut n'existe pas, alors c'est que ce produit n'a tout simplement pas cet attribut. Sinon, la valeur est définie dans la propriété portée attr_valeur.

Ton prof n'a pas à "injecter" un fichier XML pour vérifier que ta base est suffisament générique : la simple utilisation de l'interface d'admin permet de le vérifier, de même que la consultation du MCD, du MLD et du MPD.

Est-ce que mon explication à moi est plus claire comme ça ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 00:52
Arf, crotte, les espaces ont été virés dans mes exemples de données... :/

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 00:55
Je reposte les exemples de données avec des espaces correctes :

produit_id  produit_libelle         produit_descriptif           produit_prix   produit_unite
1           Clavier 105T Logitech   Blabla du clavier génial     30             -
2           Clavier Sans Fil        Blabla multimédia tout ça    60             -
3           Clavier lumineux        Luminosité réglable blabla   80             -


attribut_id   attribut_nom
1             marque
2             connectique
3             multimedia


attribut_id   produit_id   attr_valeur
1             1            Logitech
2             1            USB
3             1            Non
1             2            Microsoft
2             2            Sans fil
3             2            Oui
1             3            Logitech
2             3            USB
3             3            Oui 


Ouais, c'est mieux là... ^^

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 01:00
Oui je comprend très bien ce que tu ma expliqué et je vais dailleurs créer les tables que tu ma conseillé.

Cependant mon prof va vraiment tester mon site en utilisant son fichier XML, je dois donc vraiment mettre une fonctionnalité dans mon site qui permettrai de le rempli. Si je ne le fais pas c'est 0 ^^

Maintenant je ne vois toujours pas comment utiliser un fichier XML en php, j'ai lu quelque truc dans la doc mais j'ai pas compris grand chose.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 01:04
Faudrait savoir à quoi ressemble son fichier XML, alors...
La moulinette qui va le digérer pour le recracher dans ta base de données se contentera d'insérer des données, mais il faut savoir ce que contient son fichier. As-tu un exemple ?

Pour l'heure, dodo...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 01:05
Oui j'ai un exemple, je le posterai demain.

Merci du coup de main encore, bonne nuit !
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 10:03
Si tu peux me donner ton adresse mail je pourrais t'envoyer tout le sujet, ca serait quand même plus simple.
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 15:14
Ok. D'après le sujet, le programme doit initialiser la base de données, c'est à dire créer la structure des tables, sans aucune donnée.
Cela signifie que le fichier XML n'a pas a être utilisé pour créer la base : c'est le programme qui doit le faire, pas forcément à partir du XML. L'idée est de fournir une sorte d'installateur.
Si je comprends bien, il faut que tu fournisses un script (intégré dans l'admin) qui va insérer les données exemple dans ta base.

A partir du moment où ta base est correctement construite, il "suffit" de traiter le XML. Je sais, c'était ta question de base, mais il était important de clarifier certains points en premier lieu, histoire que ta base soit correctement construite et que tu puisses expliquer dans ton rapport pourquoi elle est comme ça (j'ai cru comprendre qu'il était primordial que tu justifies les choix faits).

Pour parcourir un document XML, PHP5 offre SimpleXMLElement qui, comme son nom l'indique, est simple d'utilisation (vraiment !).

Par exemple :

$sxe = new SimpleXMLElement('Parametres.xml', NULL, TRUE);
// Pour parcourir tous les produits du document XML :
foreach ($sxe -> ListeProduits -> Produit as $item) {
  // Listons toutes les propriétés :
  foreach ($item -> Propriete as $prop) {
    echo $prop['nom'], " : $prop
";
  }
  // Le descriptif :
  echo "Descriptif : ", $item -> Descriptif, '
';
}

C'est juste un exemple très élémentaire pour montrer comment parcourir le document et accéder aux différentes propriétés des produits.
De même, pour parcourir les rubriques, il suffit de boucler avec foreach sur $sxe -> ListeRubriques -> Rubrique

Attention à l'encodage : chez moi, avec Eclipse, mes fichiers sont toujours encodés en UTF-8. Lors de l'affichage, si je ne spécifie pas l'encodage des caractères (avec une balise meta et/ou dans la déclaration XML du document), je peux avoir des surprises. Pour afficher des caractères encodés UTF-8 sur une page ISO-8859-1, il faut utiliser la fonction utf8_decode().

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 16:22
Ok je vais essayer ca dès que j'aurais fini le programme inverse.

La j'essaye de faire une programme qui transforme mes tables produits et rubriques en fichier XML comme dans le sujet.

Comme ca je pourrais rentrer tout mes produits via phpMyAdmin et les exporter ensuite en XML.

J'ai juste encore un petit problème pour les rubriques j'arrive a avoir juste la rubrique supérieur mais pas celle encore au dessus.

Merci en tout cas pour ton coup de main, je vois un peu plus comment résoudre mon problème.

Notre projet te parrait-il proche de la réalité ? Où s'agit il de quelque chose de vraiment scolaire ?
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 16:58
Un peu les deux mon colonnel.
Disons que puisqu'on te demande de développer une boutique en ligne, forcément, c'est proche de la réalité.
Ce qui est très scolaire, ce sont les contraintes imposées et le fichier XML qui est totalement inutile dans la réalité. Mais il est sûrement là pour que vous manipuliez un document XML, ce n'est que la justification qui n'est pas crédible. On aurait pu demander par exemple de développer une API permettant un accès aux données par une application tierce : les données retournées auraient alors été du XML, on aurait pu imaginer de demander de développer un client pour cette API, donc capable de lire les données dans le XML pour les injecter dans la base de l'affilié (c'est le genre d'application réaliste pour une affiliation, comme chez Amazon par exemple).
Ce n'est pas crédible non plus d'avoir un seul fichier XML pour définir la liste des produits et la liste des rubriques.
Par ailleurs, ton prof a des lacunes en linguistique, puisque sémantiquement parlant, les rubriques qui dépendent d'une autre ne sont pas supérieures mais inférieures, contrairement à ce qui est écrit dans le ficheir XML. Mais ça, c'est un détail ^^

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 19:13
Ok c'est bien ce qui me semble, je n'y connais rien en XML mais je voyais bien ca comme un format d'echange plutôt léger.

Je vais essayer de terminer mes deux fonctions concernant le XML et je verrais ce que mon prof m'en dira vendredi matin 8 heure tapante.
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 19:46
Alors j'ai un souci

ce code :

function affiche_rubsup($id, $xml)
{
global $xml;

$sql 'SELECT * FROM rubrique WHERE id_rubrique "'.$id.'"';
$rub_sup = query($sql);

if ( mysql_num_rows($rub_sup) != 0)
{
         while( $nuplet_rub_sup = mysql_fetch_assoc($rub_sup))
{
$xml .= '<Rubrique>'.$nuplet_rub_sup["nom_rubrique"].'</Rubrique>';
}
affiche_rubsup($nuplet_rub_sup["id_sup"], $xml);
}
else
return;

}



est censé m'afficher les rubriques supérieur de chaque rubriques, bizarrement il s'arrête à la première étape, il affiche que la rubrique juste au dessus.

Je ne trouve pas l'erreur d'alog...
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 19:57
C'est bon j'ai rien dis... une erreur bête
0
kaya57200 Messages postés 18 Date d'inscription mardi 8 décembre 2009 Statut Membre Dernière intervention 23 décembre 2009
9 déc. 2009 à 20:45
Bon j'ai fini le XML_writer, je m'attaques au reader.

J'ai relu ton bout de code que tu ma donné mais je comprends vraiment rien à la synthaxe de cet objet, le foreach aussi je ne l'ai jamais vu comme ca.

Peux tu m'en dire d'avantage ou m'orienter vers une doc un peu plus compréhensible que l'officielle ?
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 21:27
Plop,

Bon j'étais au téléphone pendant un peu plus d'une heure, donc j'ai pas pu répondre. T'as trouvé la solution, ok. Mais... Je suis pas convaincu que ta fonction soit très optimisée : une requête à chaque appel de la fonction (pour la récursivité), c'est facile et pratique, mais c'est lourd en ressources...
Est-ce que tu peux me décrire un peu ta table Rubrique ? Je pense qu'il est possible d'éviter les multiples requêtes identiques chaque fois qu'on descend d'un niveau...

Concernant foreach, maintenant.
foreach est une structure de langage de PHP qui permet d'itérer sur tous les éléments d'un élément. Hum, je sais pas si c'est clair.
Typiquement, on utilise foreach pour itérer sur tous les éléments d'un tableau. Mais foreach permet un peu plus que ça, notamment d'itérer sur des objets qui implémentent l'interface Traversable. Cette interface est une interface "système" (que l'utilisateur n'est pas censé implémenter dans ses classes) qui permet à PHP de savoir si objet peut être parcouru comme un itérateur. C'est le cas de SimpleXMLElement. La manière dont un objet SimpleXMLElement est parcouru n'est pas modifiable par l'utilisateur.

Ce qui rend SimpleXMLElement (je vais utiliser SXE, parce que c'est chiant à écrire en entier ^^) c'est la manière d'accéder aux noeuds et aux attributs des éléments. Ainsi, on accède à un noeud simplement par le nom de l'élément, comme s'il s'agissait d'une propriété de l'objet SXE. La valeur retournée est alors un autre objet SXE (mais si, c'est pas compliqué ^^).
Par exemple, avec ton fichier, essaie ça :
header('Content-type: text/plain');
$sxe = new SimpleXMLElement('Parametres.xml', NULL, TRUE);
var_dump($sxe);
var_dump($sxe -> ListeProduits);

NB : le header est là juste pour faciliter la lecture du dump de la variable en passant à la ligne quand il faut ;)

Comme il ya plusieurs produits, si tu fais :
var_dump($sxe -> LIsteProduits -> Produit);
tu obtiens un objet SXE dont la propriété Produit est un tableau numérique contenant tous les produits.
Chaque produit est donc accessible par son indice dans le tableau, par exemple : $sxe -> ListeProduits -> Produit[0]
C'est pour cela que foreach est capable d'itérer sur $sxe -> ListeProduits -> Produit : parce que l'itération va porter sur un tableau.
foreach va donc passer en revue chaque produit et dans la boucle, chaque produit sera accessible via la variable $item.

Ensuite, on fait un peu la même chose avec $item : on va passer en revue chaque propriété du produit, en itérant sur $item -> Propriété.
Cela revient à récupérer :
[list][*]$sxe -> ListeProduits -> Produit[0] -> Propriete[0]
[*] $sxe -> ListeProduits -> Produit[0] -> Propriete[1]
[*] $sxe -> ListeProduits -> Produit[0] -> Propriete[2]
[*] etc
[*] $sxe -> ListeProduits -> Produit[1] -> Propriete[0]
[*] $sxe -> ListeProduits -> Produit[1] -> Propriete[1]
[*] etc/list

J'espère que c'est un peu plus clair, si c'est pas suffisant, n'hésite pas...

Bon, du coup, j'ai du regarder d'un peu plus près ce fichier XML et je comprends mieux comment sont décrites les rubriques...
Effectivement, pour chaque rubrique listée, il est précisée les rubriques dont la rubrique en question est un enfant. C'est bizarre, parce qu'une même rubrique peut avoir plusieurs parents... et donc plusieurs enfants. Ce n'est donc pas hiérarchisé en arbre classique, c'est ce qui m'a dérouté à la première lecture.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
9 déc. 2009 à 21:30
Rhaaaaaaaa saleté de formatage de mer** pffffffffffffffff

Je refais la liste de l'itération, parce que là, c'est vraiment nul... :/

- $sxe -> ListeProduits -> Produit[0] -> Propriete[0]
- $sxe -> ListeProduits -> Produit[0] -> Propriete[1]
- $sxe -> ListeProduits -> Produit[0] -> Propriete[2]
- etc
- $sxe -> ListeProduits -> Produit[1] -> Propriete[0]
- $sxe -> ListeProduits -> Produit[1] -> Propriete[1]
- etc


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
0
Rejoignez-nous