Table de jointure vide

[Résolu/Fermé]
Signaler
-
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
-
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

Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
220
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
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
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
220
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
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
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
220
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)
Encore merci nagashima
tu m'a été d'un grand soutient :)
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
220
pas de soucis ^^

bon dev.
naga