Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/10/2011, 11h32   #1
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Par défaut Problème Clé Etrangère

Bonjour à vous,

J'ai lu quelques tutos concernant les clé étrangères ( je suis sous phpmyadmin ) mais je n'arrive toujours pas à mettre en place un truc tout bête, je pense que j'ai une erreur de structure.

J'ai tout simplement deux tables: une table catégorie et une table produit.

Je peux que les produits soient affectés à une catégorie.
Que si la catégorie disparaît, tous les produits virent mais que si l'on supprime tous les produits, la catégorie reste.

J'ai fait cela:

Catégorie ( ID_catégorie (primaire), nom_categorie )

Produits ( ID_produit (primaire), nom produit, produit_id (étrangère) )

Ce n'est pas comme ça qu'il faut faire ?

Je me retrouve avec cela quand j'essaye d'enregistrer une clé étrangère dans la bdd:

erreur sq: Cannot add or update a child row: a foreign key constraint fails ('produits'.'produits', CONSTRAINT 'produits_ibfk_1' FOREIGN KEY ('categorie_id') REFERENCES 'categories' ('ID_categorie') ON DELETE CASCADE ON UPDATE CASCADE)
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 12h07   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Tu mets une clé étrangère en boucle ?

Il faut mettre une clé étrangère sur la catégorie dans produits et non un clé étrangère de produit sur produit:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- -----------------------------------------------------
-- Table `mydb`.`category`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`category` (
  `id` BIGINT(25) NOT NULL ,
  `label` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `label_UNIQUE` (`label` ASC) )
ENGINE = InnoDB;
 
 
-- -----------------------------------------------------
-- Table `mydb`.`products`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`products` (
  `id` BIGINT(25) NOT NULL ,
  `name` VARCHAR(45) NOT NULL ,
  `ref` VARCHAR(100) NOT NULL ,
  `category_id` BIGINT(25) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `ref_UNIQUE` (`ref` ASC) ,
  INDEX `fk_products_category` (`category_id` ASC) ,
  CONSTRAINT `fk_products_category`
    FOREIGN KEY (`category_id` )
    REFERENCES `mydb`.`category` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 13h29   #3
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Merci pour la réponse,

Je viens de corriger mes tables mais j'ai toujours l'erreur.
Je ne comprend pas très bien le message, j'ai une boucle c'est a dire ?

Tu penses que c'est en rapport avec cette ligne:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
//requête SQL:
$sql = "SELECT *
        FROM categories";
 
//exécution de la requête:
$requete = mysql_query($sql) or die( mysql_error());
	// FORMULAIRE
?>
 
		<h1>Ajouter un article:</h1>
		<br /> 
	    <form action="addimage.php" method="post" enctype="multipart/form-data">
		<input type="hidden" name="action" value="add" />
		<input type="hidden" name="MAX_FILE_SIZE" value="5242880" />
 
 		<p>Ajouter le titre:<br /><input type="text" name="titre_image"/></p>
		<p>Titre en Anglais::<br /><input type="text" name="titre_image2"/></p>
		<p>Ajouter le texte:<br /><textarea name="texte_image"></textarea></p>
		<p>Texte en Anglais:<br /><textarea name="texte_image2"></textarea></p>
 
		<p><input type="file" name="userfile" /></p>
 
        <p><select name="nom_categorie">  
        <?php while ($result = mysql_fetch_array($requete)) {
		echo '<option value="'.$result['dossier'].'">'.$result['nom_categorie'].'</option>';
		}?></select></p>
 
		<p><input type="submit" name="submit" value="Envoyer" /></p>
	</form>
En gros, je récupère ensuite comme ça:

Code :
1
2
3
4
5
6
7
8
9
 
	$nom_categorie = mysql_real_escape_string($_POST['nom_categorie']);
 
	$requete_cat = "SELECT ID_categorie
        		  	FROM categories
				  	WHERE ID_categorie = '$nom_categorie'";
 
	//exécution de la requête:
	$categorie = mysql_query($requete_cat) or die( mysql_error());
Pour ensuite enregistrer l'id dans la table.
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 13h39   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Citation:
erreur sq: Cannot add or update a child row: a foreign key constraint fails ('produits'.'produits', CONSTRAINT 'produits_ibfk_1' FOREIGN KEY ('categorie_id') REFERENCES 'categories' ('ID_categorie') ON DELETE CASCADE ON UPDATE CASCADE)
Cette erreur signifie que la modification ou l'insertion d'un tuple (ligne) fils (donc en dépendance vis-à-vis d'une autre table par une de ses clés étrangères) à échoué car cette dépendance n'est pas satisfaite.

Par exemple, il est impossible de créer un produit ayant un category_id inexistant. De même il est impossible de supprimer une catégorie qui est référencée par un produit (à moins d'avoir mis le flag ON DELETE CASCADE ce qui détruit les références filles).

Donc
1. Crée les catégories
2. Crée les produits en mettant des id de catégories existants

Au passage, donne voir les structure des tes tables (tu peux les obtenir en executant la requête SQL "SHOW CREATE TABLE `table`" où table est le nom d'une table).
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 13h50   #5
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Voici:

ID_categorie int(11) Non
nom_categorie varchar(100) Non
dossier varchar(100) Non
Index:

Nom de l'index Type Unique Compressé Colonne Cardinalité Interclassement Null Commentaire
PRIMARY BTREE Oui Non ID_categorie 3 A
images

Colonne Type Null Défaut
ID_image int(11) Non
titre_image varchar(200) Non
titre_image_en varchar(200) Non
texte_image longtext Non
texte_image_en longtext Non
url_image varchar(200) Non
categorie_id int(11) Non
Relié à: categories -> ID_categorie
Index:

Nom de l'index Type Unique Compressé Colonne Cardinalité Interclassement Null Commentaire
PRIMARY BTREE Oui Non ID_image 0 A
categorie_id BTREE Non Non categorie_id 0 A
utilisateurs
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 14h11   #6
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 991
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 991
Points : 5 032
Points : 5 032
Ton select devrait permettre de sélectionner un ID_categorie plutôt qu'un dossier.

Et ta requête de sélection est fausse:
Code :
SELECT ID_categorie FROM categories WHERE ID_categorie = '$nom_categorie'
Devrait être:
Code :
SELECT ID_categorie FROM categories WHERE nom_categorie = '$nom_categorie'
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 14h30   #7
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
En fait le dossier est une juste un champ de ma base, pour pouvoir uplodé des images dedans.

Je n'y arrive vraiment pas, je dois juste récupèrer l'id et la mettre dans le champ correspondant

De toute façon, la contrainte entre les tables n'est pas bonne non ?
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 17h32   #8
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Re-bonjour,

Je viens de revérifier toutes mes tables, j'arrive bien à insérer des enregistrement à partir de phpmyadmin, j'ai bien la liste déroulante sur ma clé étrangère donc je pense que mes tables sont bien liés.

Je pense vraiment que cela vient de mon traitement, en faisant un echo de $categorie, il me sort un #6 alors que n'ai pas cet ID dans ma table catégorie.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 $nom_categorie = mysql_real_escape_string($_POST['nom_categorie']); 
 
 $requete_cat = "SELECT ID_categorie 
 FROM categories 
 WHERE nom_categorie = '$nom_categorie'"; 
 
 //exécution de la requête: 
 $categorie = mysql_query($requete_cat) or die( mysql_error()); 
 
$categorie = mysql_fetch_array($requete);
 
 
$sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie')";  
  $quer = mysql_query($sq) or die('erreur sq: '.mysql_error());
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 18h17   #9
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
Bonsoir,

Citation:
$categorie = mysql_query($requete_cat) or die( mysql_error());

$categorie = mysql_fetch_array($requete);
Code :
1
2
3
$requete = mysql_query($requete_cat) or die( mysql_error()); 
 
$categorie = mysql_fetch_array($requete);
A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 18h26   #10
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Merci pour cette erreur, mais même chose malheureusement
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 18h34   #11
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
Citation:
$sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie')";
$categorie est un array.
Code :
$sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie[0]')";
Et fait attention si jamais la requête ne retourne pas d’enregistrement, fait un test avec mysql_num_row.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h09   #12
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
J'ai fait comme ceci:

Code :
1
2
3
4
5
 
$categorie = mysql_fetch_array($requete);
 
	$test = mysql_num_rows($categorie);
	echo $test;
J'ai eu cette erreur:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\upload\addimage.php on line 48
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h21   #13
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
Code :
1
2
3
4
5
6
$requete = mysql_query($requete_cat) or die( mysql_error()); 
if(mysql_num_rows($categorie)>0){
	$categorie = mysql_fetch_array($requete);
	$sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie[0]')";  
	$quer = mysql_query($sq) or die('erreur sq: '.mysql_error());
}
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h42   #14
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Notice: Undefined variable: categorie in C:\wamp\www\upload\addimage.php on line 45

Warning: mysql_num_rows() expects parameter 1 to be resource, null given in C:\wamp\www\upload\addimage.php on line 45

J'ai bien l'impression qu'il ne passe rien non ?
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h46   #15
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
Mauvais copier/coller
Code :
if(mysql_num_rows($requete)>0)
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/10/2011, 19h56   #16
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Merci,

Pas d'erreurs cette fois ça, mais rien ne s'inscrit dans la base.
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 04h13   #17
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
La requête select retourne un résultat?
Essaie de faire
Code :
1
2
3
4
5
6
if(mysql_num_rows($requete)>0){
	$categorie = mysql_fetch_array($requete);
	$sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie[0]')"; 
 	echo $sq;
	$quer = mysql_query($sq) or die('erreur sq: '.mysql_error());
}
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 07h44   #18
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Bizarre, aucun message
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 08h02   #19
Rédacteur/Modérateur
 
Avatar de andry.aime
 
Homme Andry Aimé
Inscription : septembre 2007
Messages : 5 133
Détails du profil
Informations personnelles :
Nom : Homme Andry Aimé
Localisation : Ile Maurice

Informations forums :
Inscription : septembre 2007
Messages : 5 133
Points : 7 266
Points : 7 266
C'est que cette requête ne retourne aucun résultat:
Code :
1
2
3
$requete_cat = "SELECT ID_categorie 
 FROM categories 
 WHERE nom_categorie = '$nom_categorie'";
Fait un echo de $requete_cat et teste le dans phpMyAdmin.

A+.
andry.aime est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/11/2011, 08h09   #20
Invité régulier
 
Inscription : novembre 2010
Messages : 109
Détails du profil
Informations forums :
Inscription : novembre 2010
Messages : 109
Points : 6
Points : 6
Il me renvoie ceci:

SELECT ID_categorie FROM categories WHERE nom_categorie = '/images/test/'

C'est ça pour le moment, je ne comprend pas pourquoi il ne me récupère pas l'ID qui va avec.
TRUNCKS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h07.


 
 
 
 
Partenaires

Hébergement Web