IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Problème Clé Etrangère [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    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)

  2. #2
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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).

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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

  6. #6
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID_categorie FROM categories WHERE ID_categorie = '$nom_categorie'
    Devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ID_categorie FROM categories WHERE nom_categorie = '$nom_categorie'

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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 ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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());

  9. #9
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonsoir,

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

    $categorie = mysql_fetch_array($requete);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $requete = mysql_query($requete_cat) or die( mysql_error()); 
     
    $categorie = mysql_fetch_array($requete);
    A+.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    Merci pour cette erreur, mais même chose malheureusement

  11. #11
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    $sq = "INSERT INTO images VALUES('','$titre_image','$titre_image2','$texte_image','$texte_image2','$nFile','$categorie')";
    $categorie est un array.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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+.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    J'ai fait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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());
    }

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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 ?

  15. #15
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Mauvais copier/coller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_num_rows($requete)>0)

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    Merci,

    Pas d'erreurs cette fois ça, mais rien ne s'inscrit dans la base.

  17. #17
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    La requête select retourne un résultat?
    Essaie de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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());
    }

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    Bizarre, aucun message

  19. #19
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    C'est que cette requête ne retourne aucun résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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+.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 109
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [9.3] Problème clé etrangère et héritage
    Par stc074 dans le forum Requêtes
    Réponses: 0
    Dernier message: 29/06/2015, 23h21
  2. problème clé etrangère xml schema
    Par patouz dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 18/05/2011, 10h44
  3. Réponses: 5
    Dernier message: 10/04/2010, 10h36
  4. [MySQL] problème clè etrangère php et mysql
    Par aboura86 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 08/05/2008, 10h32
  5. Problème avec plusieurs clés etrangères
    Par rc-cheap dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/07/2007, 11h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo