Page 1 sur 2
Enregistrement table liée
Posté : 12 oct. 2011, 01:35
par TRUNCKS
Bonjour à vous,
J'ai deux tables comme ceci:
rayons(ID_rayon, nom_rayon)
produits(ID_produit, nom_produit, #id_rayon)
J'aimerai, à partir d'une liste déroulante des rayons, faire un enregistrement de produit, en fonction de la catégorie qui aura été choisie dans la liste:
Voici où j'en suis:
if(isset($_POST['action'])){
// Récupération des variables nécessaires
$nom_produit = mysql_real_escape_string($_POST['nom_produit']);
$nom_rayon = mysql_real_escape_string($_POST['nom_rayon']);
{
$sq="insert into produits values('',\"$nom_produit\",\"$nom_rayon\")";
$quer=mysql_query($sq ) or die('erreur sq: '.mysql_error());
}
echo '<p style="color:#ff0000;font-weight:bold;">Produits correctement ajoutés à la base de données</p>'."<br><br><a href=\"addproduit.php\">Ajouter un nouveau produit</a>"."<br><br><a href=\"produits.php\">Revenir à l'accueil</a>";
}
else{
//requête SQL:
$sql = "SELECT *
FROM rayons";
//exécution de la requête:
$requete = mysql_query($sql) or die( mysql_error());?>
<h1>Ajouter un produit:</h1>
<br />
<form action="addproduit.php" method="post">
<input type="hidden" name="action" value="add">
Ajouter des produits:<br><input type="text" name="nom_produit"><br><br />
<select name="nom_rayon">
<?php
while ($result = mysql_fetch_array($requete)) {
echo '<option value="'.$result['ID_rayon'].'">'.$result['nom_rayon'].'</option>';
}
?>
</select>
<br>
<br>
<input type="submit" name="valider" value="Envoyer">
</form>
Mon soucis, c'est que ma clé étrangère est sur l'ID_rayon, je ne sais pas trop comment formuler ma requête d'enregistrement..
Re: Enregistrement table liée
Posté : 12 oct. 2011, 21:08
par Ryle
Je ne comprends pas vraiment ce que tu essayes de faire.... De ce que j'ai compris tu créer des produits que tu veux rattacher à un rayon (provenant d'une autre table) en spécifiant l'id du rayon concerné.
Par contre, je ne vois pas quel est le problème ni quel est la question... cependant (et ça répondra peut être à ta demande), lorsque tu construits un select en html, c'est l'attribut value de l'option sélectionné qui va être envoyé au serveur. Donc dans ton select, ce ne sont pas les nom des rayons qui sont envoyés (les libellés), mais les id rayons (les values).
Donc quand tu récupères $_POST['nom_rayon'], en réalité tu récupères actuellement l'id...
Re: Enregistrement table liée
Posté : 12 oct. 2011, 21:11
par TRUNCKS
Merci d'avoir pris la peine de me répondre, je reconnais que ce n'est pas très clair.
En fait, j'ai un formulaire en bas, pour rajouter un produit, ensuite, avant de valider, il faut sélectionner une catégorie, pour bien ajouter le produit dans la bonne catégorie.
Par exemple, je tape singe dans le formulaire, je selectionne "animaux" dans ma liste déroulante, et je valide.
Une fois valider, j'aimerais que dans ma bdd, cela rentre dans les champs, le nom du produit, et l'ID de la catégorie demandée.
produits(ID_produit, nom_produit, #id_rayon)
Je ne suis pas sur que cela soit plus clair...
Re: Enregistrement table liée
Posté : 12 oct. 2011, 23:24
par Ryle
Ben c'est plus clair en effet, mais surtout : c'est déjà ce que fait ton code... donc s'il y a un soucis faut nous lequel, ce que tu obtiens en base, par rapport à ce que tu devrais obtenir, toussa quoi

....
Re: Enregistrement table liée
Posté : 13 oct. 2011, 08:57
par TRUNCKS
Voici le message d'erreur que j'obtiens
erreur sq: Cannot add or update a child row: a foreign key constraint fails (`table1`.`produits`, CONSTRAINT `produits_ibfk_1` FOREIGN KEY (`id_categorie`) REFERENCES `categories` (`ID_categorie`) ON DELETE NO ACTION ON UPDATE CASCADE)
Re: Enregistrement table liée
Posté : 13 oct. 2011, 09:30
par xTG
L'id_categorie est-il l'id du rayon ou bien un autre champ ?
Re: Enregistrement table liée
Posté : 13 oct. 2011, 09:32
par TRUNCKS
Oui c'est bien la même chose, j'ai juste changé le nom entre temps.
Re: Enregistrement table liée
Posté : 13 oct. 2011, 13:30
par moogli
qu'elle est la la requête SQL ? (affiche la completement avec le message d'erreur ça peux aider).
ta requete c'est un alter table ou un insert c'est pas clair la ?
a priori tu viole la contrainte sur la clef étrangère mais je ne peux en dire plus avec si peu
@+
Re: Enregistrement table liée
Posté : 13 oct. 2011, 13:45
par TRUNCKS
Voilà ma requête:
$sq="insert into produits values('',\"$nom_produit\",\"$nom_rayon\")";
$quer=mysql_query($sq ) or die('erreur sq: '.mysql_error());
En fait, avant de valider le post, je selectionne la catégorie où va aller s'inscrire mon produit.
Théoriquement, si je sélectionne "papeterie" dans ma liste déroulante, et que j'écris "livre" dans le formulaire, cela devait inscrire dans ma table:
ID_produit:"1" ( auto-increm )
nom-produit:"livre"
id_rayon ( c'est ma clé étrangère, reliée à l'ID_rayon de ma table rayon ): "1" ( qui correspond à l'ID papeterie de ma table rayon )
Oula, c'est dur à décrire lol
Re: Enregistrement table liée
Posté : 13 oct. 2011, 13:57
par moogli
bon alors bon heu comment dire,
la clef primaire de la table catégorie c'est un entier ?
si tu analyse ta requête fournis une chaine de caractère, moi j'y vois une erreur de conception !
ensuite as tu fait un echo $sq; avant le mysql_query histoire de voir a quoi ressemble la requete et pourquoi pas la tester via phpmyadmin (ou la console mysql ou tout autre chose qui te permetterais de la tester

)
@+
Re: Enregistrement table liée
Posté : 13 oct. 2011, 14:16
par TRUNCKS
Voilà ce que j'obtient:
insert into produits values('',"coucou","coucou")erreur sq: Cannot add or update a child row: a foreign key constraint fails (`table1`.`produits`, CONSTRAINT `produits_ibfk_1` FOREIGN KEY (`id_categorie`) REFERENCES `categories` (`ID_categorie`) ON DELETE NO ACTION ON UPDATE CASCADE)
Il me met deux fois coucou alors que je l'ai rentré une seule fois, dans le champ formulaire.
Il devrait y avoir librairie dans le troisième. (l'ID tout du moins )
Re: Enregistrement table liée
Posté : 13 oct. 2011, 14:28
par moogli
tu peux nous monter les create tables (ou desc) des deux tables) une jeux de donnée minimal, parce que la je ne comprend pas trop le truc.
La clef primaire c'est un chiffre ou un chaine de caractère ?
@+
Re: Enregistrement table liée
Posté : 13 oct. 2011, 14:34
par TRUNCKS
C'est un chiffre pour la clé primaire, mais là j'ai l'impression que je demande un nom non ?
Re: Enregistrement table liée
Posté : 13 oct. 2011, 17:14
par TRUNCKS
J'ai un peu regardé, mais je ne vois pas comment je peux donner la structure de ma table, je l'ai fait directement sur l'interface de phpmyadmin

Re: Enregistrement table liée
Posté : 13 oct. 2011, 17:32
par TRUNCKS
Désolé pour le double post, je viens de trouver j'ai fait un erreur stupide:
$separateur = ';';
$lesNoms = explode($separateur, mysql_real_escape_string($_POST['nom_produit']));
foreach ($lesNoms as $nom_categorie)
C'était nom_produit à la fin, pour mon séparateur, je suis naze....
Par contre, j'ai un petite question pour moi, dans cette ligne:
$sq="insert into produits values('',\"$nom_produit\",\"$nom_categorie\")";
C'est cette ligne qui fait que dans la base, cela inscrit l'ID au lieu du nom ?
echo '<option value="'.$result['ID_categorie'].'">'.$result['nom_categorie'].'</option>';