Enregistrement table liée

Eléphant du PHP | 184 Messages

12 oct. 2011, 01:35

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..
Modifié en dernier par TRUNCKS le 12 oct. 2011, 21:08, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 oct. 2011, 21:08

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...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 184 Messages

12 oct. 2011, 21:11

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...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 oct. 2011, 23:24

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 :) ....
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 184 Messages

13 oct. 2011, 08:57

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)

ViPHP
xTG
ViPHP | 7331 Messages

13 oct. 2011, 09:30

L'id_categorie est-il l'id du rayon ou bien un autre champ ?

Eléphant du PHP | 184 Messages

13 oct. 2011, 09:32

Oui c'est bien la même chose, j'ai juste changé le nom entre temps.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2011, 13:30

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 ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

13 oct. 2011, 13:45

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2011, 13:57

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 ;) )


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

13 oct. 2011, 14:16

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 )

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

13 oct. 2011, 14:28

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 ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 184 Messages

13 oct. 2011, 14:34

C'est un chiffre pour la clé primaire, mais là j'ai l'impression que je demande un nom non ?

Eléphant du PHP | 184 Messages

13 oct. 2011, 17:14

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 :(

Eléphant du PHP | 184 Messages

13 oct. 2011, 17:32

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>';