Table de jointure vide

Résolu/Fermé
simsons - 29 oct. 2013 à 13:25
 Utilisateur anonyme - 30 oct. 2013 à 15:33
Bonjour,

Je viens vers vous pour vous exposez mon problème.

J'ai deux tables :

- evenement avec id en VARCHAR (25) que je récupère d'un fichier xml donc unique
- categorie avec id auto incrémente

j'ai une relation O,N-O,N entre ces deux tables.
Donc j'aurai une troisième table qui va prendre ces deux clés primaires

Je remplit ma base de donnés avec mon fichier XML

Les tables evenement et categorie se remplissent bien, par contre ma table qui comporte mes deux clés primaires ne se remplit pas...

Si quelqu'un à une idée
Merci pour votre aide

Cordialement Simon

2 réponses

Utilisateur anonyme
29 oct. 2013 à 13:34
salut,

Dans un premier temps je dirai que donner ta procédure nous permettrai de voir ce que tu fais et donc ce qui pose problème.

naga
0
Tous d'abord merci pour ton aide

première étape je récupère mon fichier XML
Pour chaque balise "Catégorie" de mon fichier XML je la place dans une variable. je fais un traitement pour voir si ma variable ne contient pas de caractères spécial et qu'elle n'existe pas


$var_categorie = (string) $element->CATEGORIE;
$tableau_categorie = $Ocategorie->FiltrerCategorie($var_categorie, $tableau_categorie);

puis je la met dans un tableau j'envoi ce tableau à mon mappage qui l'insère.


$inserer_categorie = $Oinserer_categorie->InsererCategorie($tableau_categorie);

Inserer

foreach ($tableau_categorie as $element_categorie) {
$sql = "INSERT INTO categorie SET nom_categorie='$element_categorie'" or die("Erreur MySQL : " .mysql_error());
$req = $bdd->query($sql);

je fais de même pour mes événements
je l'envoi vers mon mappage

$sql = "INSERT INTO evenement VALUES('".$tableau_evenement['ID']."','".$tableau_evenement['Titre']."','".$tableau_evenement['Adresse']."','".$tableau_evenement['Insee']."','".$tableau_evenement['Code Postal']."','".$tableau_evenement['Commune']."','".$tableau_evenement['Date Début']."','".$tableau_evenement['Date Fin']."','".$tableau_evenement['Heure Ouverture']."','".$tableau_evenement['Heure Ouverture 2']."','".$tableau_evenement['Heure Fermeture']."','".$tableau_evenement['Heure Fermeture 2']."','".$tableau_evenement['Images']."','".$tableau_evenement['Description']."','".$tableau_evenement['URL']."')";
$req = $bdd->query($sql);

Le problème que je n'arrive pas à résoudre, c'est comment je fais pour dire qu'elle categories appartient à un evenement.
D'où ma table de jointure vide
0
Utilisateur anonyme
30 oct. 2013 à 11:42

INSERT INTO categorie SET nom_categorie='$element_categorie'

personnellement ca me choque x) je préfère la syntaxe :


INSERT INTO categorie (nom_categorie) VALUES ('$element_categorie')


sinon, si tu sais quel catégorie correspond à quel évènement, il faut que tu récupère les identifiant insérés.

Pour ton évènement tu insère l'ID, je suppose donc qu'il n'y a pas d'id auto incrémenté dans cette table et donc qu'il est connu à l'avance.

La "manipulation" à faire est donc de récupérer l'ID généré par ton insertion de categorie puis de faire ton insert dans ta table de liaison.


Ensuite, dans ton explication, on ne voit pas dans quel mesure un evènement est lié à une catégorie (une info dans le xml ?) .... tu dis
je fais de même pour mes événements 
comment pourrai tu visuellement dire que tel catégorie et tel événement sont liées à partir des infos du XML?
0
Merci pour ton aide sa m'aide beaucoup :)

Voila une partie de mon xml
cette partie c'est 1 evenement

<LISTING diffgr:id="LISTING1" msdata:rowOrder="0">
<ID>FMAAQU064FS000GB</ID>
<DATECREA>2006-03-01T14:42:37.0000000+01:00</DATECREA>
<DATEMAJ>2013-03-27T03:33:34.7930000+01:00</DATEMAJ>
<STRUCTURE_ID>21</STRUCTURE_ID>
<OBJETTOUR_CODE>FMA</OBJETTOUR_CODE>
<OBJETTOUR_LIBELLE>Fêtes et manifestations</OBJETTOUR_LIBELLE>
<SORT_SPECIFIQUE>03015f77-7273-4b3f-aca3-1b132f15619c</SORT_SPECIFIQUE>
<NOTPANIER>true</NOTPANIER>
<NOM_MANIF>Marché de Noël</NOM_MANIF>
<FICHIER/>
<LOCALISATION/>
<TARIF_TEXTE>Entrée gratuite</TARIF_TEXTE>
<URL_ID/>
<DESCRIPTIF_COMPL/>
<ADRESSE2/>
<MAIL_ID/>
<GENERIQUE/>
<FACEBOOK/>
<LAT>43.3611060</LAT>
<CATEGORIE>Marché</CATEGORIE>
<TEL_ID>+ 33 6 11 77 13 88|</TEL_ID>
<URL/>
<TWITTER/>
<TAG/>
<MAIL/>
<DESCRIPTIF></DESCRIPTIF>
<ADRESSE1>Mur à gauche</ADRESSE1>
<OUVERTURE>14/12/2013|14/12/2013|10:00|20:00|||</OUVERTURE>
<RESTO/>
<TEL>+ 33 6 11 77 13 88|</TEL>
<FLICKR/>
<MODE_PAIEMENT/>
<CODE_INSEE>64160</CODE_INSEE>
<ORGANISATEUR/>
<TEL_MOB/>
<CODE_POSTAL>64250</CODE_POSTAL>
<PHOTO>
MEDIA_aac9ab44-771a-4747-bd3a-6a61261af69e.jpg#MEDIA_6608c2ab-ec5b-48dd-887d-dbe191abaffc.jpg
</PHOTO>
<TYPE>Manifestation commerciale</TYPE>
<INTERET>Intérêt départemental</INTERET>
<QUALIF/>
<PAS_DIFF>non|</PAS_DIFF>
<COMMUNE>CAMBO-LES-BAINS</COMMUNE>
<LOCALISATION_TEXTE/>
<VIDEO/>
<TEL_MOB_ID/>
<OUVERTURE_RESA/>
<LON>-1.3993760</LON>
<THEME>Artisanat#Noël</THEME>
</LISTING>


Voila mon ID evenement
<ID>FMAAQU064FS000GB</ID>
et voila les categories
<CATEGORIE>Marché</CATEGORIE>
Il se peut que les categories soit dans ce genre la
<CATEGORIE>Marché#Exposition</CATEGORIE>
Cette ligne la m'indique que cette evenement appartient a deux categories :
- Marché
- Exposition
0
Utilisateur anonyme
30 oct. 2013 à 13:42
Ok ! je comprends mieux =D

Donc en fait je vais t'expliquer la procédure, je vais peu être dire ce que tu as dejà fais mais bon :

Dans un premier temps, tu insére les catégories (ca tu l'à déjà), et tu t'assure d'avoir une colonne d'identifiant unique auto-incrémentée :

foreach ($tableau_categorie as $element_categorie) {
$sql = "INSERT INTO categorie (nom_categorie) VALUES ('$element_categorie')" or die("Erreur MySQL : " .mysql_error());
$req = $bdd->query($sql);

De cette manière, tu aura ton stock de catégorie pour les lier aux futurs événements.

Ensuite tu insères tous tes événements, l'identifiant de ton événement étant normalement unique (dans le cas contraire, il faudra que tu ajoute une colonne auto-incrémentée, mais dans tous les cas, il faut que tu ai un identifiant unique).

Pour ajouter à ta base le contenu, je te conseil d'écrire la requête en énumérant les colonnes qui tu vas donné (l'ordre d'énumération des colonnes devant être respecté pour l'énumération des valeurs à insérer) soit :

$sql = "INSERT INTO evenement (ID,Titre,Adresse,Insee,CodePostal,Commune,DateDebut,DateFin,HeurOuverture,HeureOuverture2,HeureFermeture,HeureFermeture2,Images,Description,URL) VALUES('".$tableau_evenement['ID']."','".$tableau_evenement['Titre']."','".$tableau_evenement['Adresse']."','".$tableau_evenement['Insee']."','".$tableau_evenement['Code Postal']."','".$tableau_evenement['Commune']."','".$tableau_evenement['Date Début']."','".$tableau_evenement['Date Fin']."','".$tableau_evenement['Heure Ouverture']."','".$tableau_evenement['Heure Ouverture 2']."','".$tableau_evenement['Heure Fermeture']."','".$tableau_evenement['Heure Fermeture 2']."','".$tableau_evenement['Images']."','".$tableau_evenement['Description']."','".$tableau_evenement['URL']."')";

Tu notera que n'ayant pas la structule de ta table en base, j'ai simplement recopié les nom du tableau 'tableau_evenement' en retirant les espaces et caractères spéciaux => ca sera à toi de renseigner les bons champs.

Donc normalement, dans ton tableau il devrait aussi y avoir :
$tableau_evenement['CATEGORIE'];
. Donc on possède l'identifiant de l'évènement ainsi que le nom de la ou les catégorie(s) le concernant. Donc, on va chercher à insérer nos liens. La table devra correspondre à ;

CREATE TABLE 'CAT_EVENT' (
'ID_EVENT' varchar(16),
'ID_CAT' int(11) unsigned NOT NULL,
PRIMARY KEY ('ID_EVENT','ID_CAT'),
KEY 'NDX_dial_tmib' ('NomFicCAT','TMIB_TYP')
CONSTRAINT 'NDX_EVENT' FOREIGN KEY ('ID_EVENT') REFERENCES 'evenement' ('ID'),
CONSTRAINT 'NDX_CAT' FOREIGN KEY ('ID_CAT') REFERENCES 'categorie' ('ID')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

et, suite à l'insertion dans l'événement, on va faire ceci :

$tab_cat = explode("#", $tableau_evenement['CATEGORIE']);
foreach ($tab_cat as $value)//pour chaque catégorie
{
//on récupère l'id de catégorie
$sql = "SELECT ID FROM categorie WHERE nom_categorie='$value'";
$req = $bdd->query($sql);
//--on ne passera qu'une fois dans le while car résultat unique
while ($row = mysqli_fetch_array($req))
{
$bdd->query("INSERT INTO CAT_EVENT (ID_EVENT,ID_CAT) VALUES ('".$tableau_evenement['ID']."' , ".$row['ID']].") ");
}
}


ca doit à peu près être ca, en tout cas je pense que j'ai bien montré l'idée, à toi de l'adapter pour ca te corresponde ;)

naga
0
Merci beaucoup

déjà grâce à ton commentaire de 11h42 j'avais réussi à faire un code similaire mais la tu m'a beaucoup aider et appris pas mal de chose et pour sa je t'en remercie !!! :)

J'ai une petite erreur que j'avais eu toute à l'heure

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, object given in

d'après ce que je comprend :

le paramètre 1 de mysqli_fetch_array() ne doit pas être un objet
0
Utilisateur anonyme
30 oct. 2013 à 15:00
le message te dis qu'il attends un paramètre. reporte toi à la doc : https://www.php.net/manual/fr/mysqli-result.fetch-array.php

le manière de requêter doit être du genre :


$query = "SELECT Name, CountryCode FROM City ORDER by ID LIMIT 3";
$result = mysqli_query($link, $query);

/* Tableau numérique */
$row = mysqli_fetch_array($result, MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);

Regarde du côté du second paramètre (ici j'ai copié MYSQLI_NUM, mais MYSQLI_ASSOC sera surement plus adapté à ta manière de coder)
0