Problème d'enregistrement dans mes tables de liaison

Eléphant du PHP | 174 Messages

20 juil. 2005, 22:42

as-tu regardé l'exemple de la FAQ ? si oui montre nous ton formulaire et la partie qui récupère les cases à cocher modes (on commence par mode, bande sera sur le même principe)
Dans ton exemple il manque la partie qui permet d'enregistré les données dans la base :pouce: :lol:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 juil. 2005, 23:16

pourquoi est-ce que tu fais ça :
$mode = $_POST['mode'];
puis ça :
// vérifions que la variable a été transmise
$tabmode = (isset($_POST['mode']))?$_POST['mode']:null;
:!: :?:

c'est une répétition

et donc $mode est un tableau
echo "Voici les modes que vous avez choisi :<br>";
// bouclons sur le tableau qui a été transmis et affichons les valeurs sélectionnées
if (!empty($tabmode)) {
    foreach($tabmode as $cle => $mode) {
        echo $cle.' : '.$mode.'<br>';
    }
} 
c'est bien, tu boucles sur le tableau et tu les affiches, c'est comme dans l'exemple
mais toi tu veux insérer une ligne dans la table pour chaque valeur ! donc c'est dans la boucle foreach que tu dois faire ta requête !

voici le code corrigé, qui devrait marcher. Lis les commentaires aussi.
$nom = $_POST['nom'];
$mois = $_POST['mois'];
$dmois = $_POST['dmois'];
$bande = $_POST['bande'];
$report = $_POST['report'];
$lien = $_POST['lien'];
$info = $_POST['info'];

// vérifions que la variable a été transmise --> tu pourrais faire ce test pour les autres variables aussi
$tabMode = (isset($_POST['mode']))?$_POST['mode']:null;

// connexion
mysql_connect("localhost","root","") or die ("Impossible de se connecter à MySQL");
// sélection de la base
mysql_select_db("cconcours") or die("Impossible de sélectionner la base de données");
// requête d'enregistrement du concours : sépare les variables du reste de la chaine
$query_string="INSERT INTO concours (nom, mois, dmois, report, lien, info) VALUES ('".$nom."', '".$mois."', '".$dmois."', '".$report."', '".$lien."', '".$info."')";
// enregistrement du concours
$query=mysql_query($query_string);
// récupération de l'identifiant attribué à ce nouveau concours
$id_concours = mysql_insert_id();

// on boucle sur le tableau de mode pour récupérer chaque identifiant de mode choisi et insérer une ligne dans concours_mode pour chacun
if (!empty($tabMode)) {
    foreach($tabMode as $cle => $idMode) {
      // création de la requête de liaison  
      $query_string="INSERT INTO concours_mode (id_concours, id_mode) VALUES ('".$id_concours."', '".$idMode."')";
      // insertion de la ligne dans la table concours_mode
      $query=mysql_query($query_string) or die(mysql_error());
    }
}

et dans mon exemple la partie "insertion dans une base de données" ne manque pas car ce n'est pas le sujet, c'est un petit exemple pour récupérer les valeurs de cases à cocher, rien de plus ;)

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:01

$nom = $_POST['nom'];
$mois = $_POST['mois'];
$dmois = $_POST['dmois'];
$report = $_POST['report'];
$lien = $_POST['lien'];
$info = $_POST['info'];

// vérifions que la variable a été transmise --> tu pourrais faire ce test pour les autres variables aussi
$tabBande = (isset($_POST['bande']))?$_POST['bande']:null;
$tabMode = (isset($_POST['mode']))?$_POST['mode']:null;

// connexion
mysql_connect("localhost","root","") or die ("Impossible de se connecter à MySQL");
// sélection de la base
mysql_select_db("cconcours") or die("Impossible de sélectionner la base de données");
// requête d'enregistrement du concours : sépare les variables du reste de la chaine
$query_string="INSERT INTO concours (nom, mois, dmois, report, lien, info) VALUES ('".$nom."', '".$mois."', '".$dmois."', '".$report."', '".$lien."', '".$info."')";
// enregistrement du concours
$query=mysql_query($query_string);
// récupération de l'identifiant attribué à ce nouveau concours
$id_concours = mysql_insert_id();
// on boucle sur le tableau de bande pour récupérer chaque identifiant de bande choisi et insérer une ligne dans concours_bande pour chacun
if (!empty($tabBande)) {
    foreach($tabBande as $cleBande => $idBande) {
      // création de la requête de liaison  
      $query_string="INSERT INTO concours_mode (id_concours, id_mode) VALUES ('".$id_concours."', '".$idBande."')";
      // insertion de la ligne dans la table concours_bande
      $query=mysql_query($query_string) or die(mysql_error());
    }
}
// on boucle sur le tableau de mode pour récupérer chaque identifiant de mode choisi et insérer une ligne dans concours_mode pour chacun
if (!empty($tabMode)) {
    foreach($tabMode as $cleMode => $idMode) {
      // création de la requête de liaison  
      $query_string="INSERT INTO concours_mode (id_concours, id_mode) VALUES ('".$id_concours."', '".$idMode."')";
      // insertion de la ligne dans la table concours_mode
      $query=mysql_query($query_string) or die(mysql_error());
    }
}
j'ai cette erreur je pensais au départ que s'était la $cle donc je l'ai renomé $cleMode et $cleBande
Duplicata du champ '1-1' pour la clef 1

Mammouth du PHP | 983 Messages

21 juil. 2005, 00:05

Cette erreur signifie que dans une de tes requetes d'insertion, tu donnes un identifiant qui existe dèja pour un des enregistrements de la table. Si tes clés primaires sont en auto increment, ne donne pas d'identifiant lors des insertions. Ca sera fait automatiquement.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:05

tu fais deux fois la même requête sur "concours_mode"

et les champs des relations ne doivent pas être UNIQUE !

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:06

A oui merde, merci.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:10

Cette erreur signifie que dans une de tes requetes d'insertion, tu donnes un identifiant qui existe dèja pour un des enregistrements de la table.
exact, c'est donc au niveau de la structure des relations qu'il faut changer qqchose, car les champs contiennent des clés étrangères ici, tu dois donc pouvoir stocker plusieurs fois la même valeurs
Si tes clés primaires sont en auto increment, ne donne pas d'identifiant lors des insertions. Ca sera fait automatiquement.
ce n'est pas le cas ici

elminio : essaye de différencier aussi les erreurs MySQL des erreurs PHP, tu sauras déjà plus facilement cibler le problème

mais là tu y est presque, c'est le code parfait à 1 ou 2 détails près ;)

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:19

Quand j'insere un second enregistrement je perd mon premier enregistrement au niveau de mes deux tables concours_bande et concours_mode.
Et je n'est pas de clef unique.
Modifié en dernier par elminio le 21 juil. 2005, 00:21, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:20

Quand j'insere un second enregistrement je perd mon premier enregistrement au niveau de mes deux tables concours_bande et concours_mode.
pardon ? :shock:

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:24

En fait quand je remplis mon formulaire une 1er fois sa stocke bien mes infos
dans mes tables relationnels par contre si j'entre un nouvelle enregistrement dans mon formulaire mes tables relationnels efface l'ancien contenu et le change par le dernier enregistrement.
$nom = $_POST['nom'];
$mois = $_POST['mois'];
$dmois = $_POST['dmois'];
$report = $_POST['report'];
$lien = $_POST['lien'];
$info = $_POST['info'];

// vérifions que la variable a été transmise --> tu pourrais faire ce test pour les autres variables aussi
$tabBande = (isset($_POST['bande']))?$_POST['bande']:null;
$tabMode = (isset($_POST['mode']))?$_POST['mode']:null;

// connexion
mysql_connect("localhost","root","") or die ("Impossible de se connecter à MySQL");
// sélection de la base
mysql_select_db("cconcours") or die("Impossible de sélectionner la base de données");
// requête d'enregistrement du concours : sépare les variables du reste de la chaine
$query_string="INSERT INTO concours (nom, mois, dmois, report, lien, info) VALUES ('".$nom."', '".$mois."', '".$dmois."', '".$report."', '".$lien."', '".$info."')";
// enregistrement du concours
$query=mysql_query($query_string);
// récupération de l'identifiant attribué à ce nouveau concours
$id_concours = mysql_insert_id();
// on boucle sur le tableau de bande pour récupérer chaque identifiant de bande choisi et insérer une ligne dans concours_bande pour chacun
if (!empty($tabBande)) {
    foreach($tabBande as $cle => $idBande) {
      // création de la requête de liaison  
      $query_string="INSERT INTO concours_bande (id_concours, id_bande) VALUES ('".$id_concours."', '".$idBande."')";
      // insertion de la ligne dans la table concours_bande
      $query=mysql_query($query_string) or die(mysql_error());
    }
}
// on boucle sur le tableau de mode pour récupérer chaque identifiant de mode choisi et insérer une ligne dans concours_mode pour chacun
if (!empty($tabMode)) {
    foreach($tabMode as $cle => $idMode) {
      // création de la requête de liaison  
      $query_string="INSERT INTO concours_mode (id_concours, id_mode) VALUES ('".$id_concours."', '".$idMode."')";
      // insertion de la ligne dans la table concours_mode
      $query=mysql_query($query_string) or die(mysql_error());
    }
}
je vais refere un essais
Modifié en dernier par elminio le 21 juil. 2005, 00:35, modifié 2 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:27

édite ton dernier message et montre nous le code que tu exécutes maintenant

car là, j'ai du mal à imaginer comment avec des INSERT, tu peux effacer la ligne précédente :shock:

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:33

tu ne fais pas de DELETE quelque part ? avec ce code je ne vois pas comme tu pourrais perdre des lignes...
tu es sûr que c'est ce qui se passe ?

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:39

Ok j'ai refais un test est sa fonctionne là
pourtant j'ai refais la même manip fausse alerte :wink: .
:lol: merci ouckileou

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 juil. 2005, 00:40

Ouf ! j'ai vraiment eu peur d'entrer dans la 4ième dimension... :pouce:

Eléphant du PHP | 174 Messages

21 juil. 2005, 00:42

je voulais savoir si tu suivais encore :lol: =D>
j'ai plus qu'analysé tout celà pour comprendre le système
Modifié en dernier par elminio le 21 juil. 2005, 00:43, modifié 1 fois.