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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 37
    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 : 37
    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 : 37
    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'

+ Répondre à la discussion
Cette discussion est résolue.

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