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

Requêtes MySQL Discussion :

Champ Catégorie multiple Mysql


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Champ Catégorie multiple Mysql
    depuis un formulaire composé de check box pour selectionné les différente catégories j'aimerai insérer le résultat dans ma bas de donné. Mais le souci est de quelle façon créer ma table pour que je puisse inssérer plusieur catégorie en meme temps?

    Merci d'avance......

  2. #2
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    ne connaissant pas ton projet je vais partir d'un exemple.

    imaginons un formulaire de choix d'une voiture :

    Type voiture :

    [] utilitaire
    [] tourisme
    [] sport

    [] 2 portes
    [] 4 portes
    [] 36 portes (wahou la classe !)

    si tes catégorie sont de cette ordre,

    la manière la plus stricte sera deux créer une base de données avec des champs de type enum.

    dans l'exemple précédent les champs serait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE voiture(
    type_voiture ENUM('utilitaire','tourisme','sport'),
    nb_portes ENUM('2 portes','4 portes','36 portes') 
    );
    d'une manière plus souple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE voiture(
    type_voiture VARCHAR(50),
    nb_portes VARCHAR(50) 
    );
    le ENUM est une liste de valeurs acceptée!

    mon exemple se rapproche-t-il de ton cas?


    ::EDIT::

    en relisant bien ton problème, je pense savoir ce que tu veux essayer de faire.

    enfait pour reprendre l'exemple. tu souhaite pouvoir cocher par exemple :

    [ ] utilitaire
    [X] tourisme
    [X] sport

    et pouvoir enregistrer plusieurs catégorie ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut suite
    effectivement c ce que j'aimerai faire.

    Je te montre exactement ce que je voudrai faire:

    voici ma table: "news"

    id|titre|categorie|contenu|


    mes catégorie sont cochable grace a des check box. ce sont les suivantes:

    charte graphique, logotype, license, marketing, .......

    et je voudrai pouvoir donc selectionner par exemple [x]charte graphique et [x] logotype.

    Mon probleme c que je n'et pas de sous catégorie......... et pour les entrer dans la base c difficile

    Merci d'avance....

  4. #4
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    dans ce cas, la manière la plus propre, et celle qui est conseillée serait de retirer le champ catégorie pour en faire une table à part entière

    je m'explique :

    ta table news sera comme ceci :

    id|titre|contenu

    ta table catégorie :

    id|id_news|categorie


    Ainsi, tu réalisera deux requète :

    celle qui va insérer la news :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO news(titre,contenu) VALUES
    ('salut!!!','Vous allez bien???');
     
    INSERT into categorie(id_news,categorie) VALUES
    (LAST_INSERT_ID(), 'charte graphique'),
    (LAST_INSERT_ID(),'logotype');

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut (LAST_INSERT_ID()
    je débute en php , langage sql, et je ne connai pas cette option (LAST_INSERT_ID() .

    Cela permet de faire la liaison entre ma table news et catégorie je suppose.
    je n'est jamais mis en place de liaisons entre deux table.
    Je suppose quil s'agit de cardinalité de type "0.1"1.0"0.n" etc...

    Peut tu me donner un lien ou m'expliquer un peu ce que tu ma dit de faire...
    Merci d'avance pour ton aide

  6. #6
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    LAST_INSERT_ID() est une fonction lié à l'option "auto_increment"

    auto_increment est une option permettant à MySQL de donner un identifiant numérique à chaque ligne d'enregistrement, de manière automatique.

    LAST_INSERT_ID() recupère le dernier identifiant numérique que MySQL s'est chargé d'enregistrer



    ta base de données va fonctionner sur le moteur InnoDB, rassure toi, ce qui va changer, c'est juste des options en plus qui sont dispo. et l'intégrité de tes données sera parfaite

    textuellement :

    La base de données news va être relié à la base catégorie via deux champs strictement identique par leur type . la pluspart du temps, c'est l'identifiant qui fait office de lien avec une autre table

    Ta table news sera lié, gràce au champ id, à la table catégorie, gràce au champ id_news. par convention, il est préférable de nommer le champ dit "enfant" en lui indiquant le nom du champ parent acollé au nom de la table parent, autrement dit : id_news.

    Cette option te permettra d'être absolument certains que toute données entrées dans la table catégorie fera obligatoirement reférence à une news qui existe!

    Petit exemple pour que tu suive jusque là :

    [news ]
    id|sujet|contenu
    1|Salut!!!|Vous allez bien???

    [categorie]
    id_news|categorie
    1|logotype
    1|charte graphique

    je veux insérer : 2 & charte graphique
    ERREUR : aucune news portant le numéro 2 existe! l'insertion échoue

    Pour assurer pleinement la cohérence des données, les clés étrangères sont la meilleure solution

    Mais pour ne pas avoir à créer des clés étrangères à tout va, si pour une données précises, on sait que la valeur ne peut prendre que tel ou tel valeurs.
    il est possible d'ENUMérer les valeurs acceptées

    Techniquement :

    Pour les clés étrangères, je dois utiliser le moteur InnoDB, pour selectionner un moteur (engine en anglais), on le précise à la fin dans une requète de création de table, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE voiture(
    id INT PRIMARY KEY auto_increment,
    nom VARCHAR(100) NOT NULL) ENGINE = INNODB;
    pour créer les clés étrangères : il y à deux manières. Soit lors de la création de table (déconseillé), soit après

    reprenons le même exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE marque(
    id INT PRIMARY KEY auto_increment,
    nom_marque VARCHAR(50) NOT NULL
    ) ENGINE=InnoDB;
    
    CREATE TABLE voiture(
    id INT PRIMARY KEY auto_increment,
    nom VARCHAR(100) NOT NULL,
    id_marque INT,
    FOREIGN KEY (id_marque) REFERENCES marque (id)
    ) ENGINE = INNODB;
    D'un point de vue structurel, je te déconseille cette méthode. et j'y prefère la méthode suivante qui consiste à modifier la table déjà créer! (Modifier en anglais : Alter )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE marque(
    id INT PRIMARY KEY auto_increment,
    nom_marque VARCHAR(50) NOT NULL
    ) ENGINE=InnoDB;
    
    CREATE TABLE voiture(
    id INT PRIMARY KEY auto_increment,
    nom VARCHAR(100) NOT NULL,
    id_marque INT,
    ) ENGINE = INNODB;
    
    ALTER TABLE voiture ADD constraint FOREIGN KEY (id_marque) REFERENCES marque (id);
    la dernière ligne peut quasiment se traduire littéralement en français qu'elle serait compréhensible :

    MODIFIER TABLE voiture AJOUTER CONTRAINTE CLÉ ÉTRANGÈRE id_marque FAISANT REFERENCE À marque (id)

    Pourquoi préférer cette méthode :

    Avant de créer un pont, il est préférable d'être certain qu'il y à de la terre des deux cotés de la rivière

    beaucoup rencontre l'erreur de créer une table faisant référence à une autre table via une clé étrangère alors qu'elle ne sera créé qu'après!
    Cette erreur se voit beaucoup dans des fichiers .sql qui exécute plusieurs requête à la suite

    la cohérence des données sans clé étrangères :

    Reprenons encore et toujours notre exemple de voiture :

    -Finallement, je ne veux vendre que des coupé cabriolet ou des Break (Sport Wagon pour les puristes ), mais je trouve inutile de créer une table type_de_voiture car il n'y aurait que deux entrées, les CC, et les SW.
    -je vais donc énumérer ces deux choix possible !
    -J'ai déjà créer la table, je ne vais pas m'amuser à la supprimer et la recréer!
    -je la modifie en ajoutant une colonne

    comment je dirais çà en français?

    MODIFIER TABLE voiture AJOUTER COLONNE type_voiture ENUMERER('CC','SW')

    essayons de la traduire en anglais alors...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ALTER TABLE voiture ADD COLUMN type_voiture ENUM('CC','SW');
    Hey! Ca marche!

    On peut peut être essayer de tester l'éfficacité :p

    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
    31
    32
    33
     
     
    //ma table est pour le moment vide, auto_increment va donc insérer "1" comme identifiant !
    INSERT INTO marque(nom_marque)
    VALUES
    ('Peugeot');
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('307','1','CC');
    //Ca fonctionne ;)
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('307',1,'SW');
    //Ca fonctionne aussi!
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('307',1,'CW');
    //Ca fonctionne pas :P
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('Mégane',2,'CC');
    //Ca fonctionne pas!
    // Et oui, il ny pas encore de marque 
    //avec un identifiant égal à 2!
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('406',1,2);
    //Ca fonctionne ! euh! bah Pourqoi????
    La dernière fonctionne! et oui, enfait tu peux aussi nommer une valeur par sa position lorsqu'elle se trouve dans un ENUM, ici, 2 est égal à SW !
    N.B: ENUM peut prendre plus de deux valeurs ENUM(champ1,champ2,champ3...)

    J'espère que ca pourra t'aider, dans tout les cas n'hésite pas à poster tes questions

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Suite
    voici mes deux tables:

    table "test_news":

    id|titre|contenu
    1|test|contenu
    2|test2|contenu2
    3|....|.........

    table "categorie_news":

    id|id_news|categorie|
    1| ? |doit je les rentré a la main|

    je n'est pas trop compris quelle doit etre ma requete ou de quelle façon remplir ma table categorie news.... dsl c pourtant explicite mes je pense manqué de connaissance...

    car une fois exécuté les insert last id ma table categorie news ressemblai a sa:

    id|id_news|categorie|
    1 | 0 |charte|
    2 | 0 |logotype|

    Merci de ton aide .....

  8. #8
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    je t'ai répondu de la façon la plus clair dont il m'est capable d'écrire
    et j'ai utiliser des exemple pour ne pas te macher le travail et que tu puisse réaliser toi même ces tables en t'aidant de l'exemple

    essais de créer tes tables, et si tu n'arrives vraiment pas explique clairement où est-ce que tu n'y arrive pas

    ensuite on vera coté php pour inserer les données!

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut suite requete
    Erreur

    requête SQL: Modifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO `ivoire`.`voiture` (
    `id` ,
    `nom` ,
    `id_marque` ,
    `type_voiture`
    )
    VALUES (
    NULL , 'megane', '', 'SW'
    )
    MySQL a réponduocumentation
    #1452 - Cannot add or update a child row: a foreign key constraint fails (`ivoire/voiture`, CONSTRAINT `voiture_ibfk_1` FOREIGN KEY (`id_marque`) REFERENCES `marque` (`id`))

  10. #10
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    tu dois préciser l' "id_marque" correspondant à "renault"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO `ivoire`.`voiture` (
    `id` ,
    `nom` ,
    `id_marque` ,
    `type_voiture`
    )
    VALUES (
    NULL , 'megane',2, 'SW'
    )
    ou ici 2 serait l'identifiant de renault!
    tu peux passer directement par la création de tes vrais tables news et categorie en fonction de l'exemple des voutures

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut Merci
    merci bcp de t'etre pancher sur mon "cas" je vai pouvoir avancé

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    tu dois préciser l' "id_marque" correspondant à "renault"

    comment je référence l'id_marque a "renault"

    dans mon exemple

    l'id_news " a "id" de la table news enfin je croi ne pas avoir tt compris en fait

  13. #13
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    reprenons donc notre exemple de concessionnaire

    dans la table marque, tu insère uniquement le nom de la marque. "id" étant avec l'option auto_increment, ce n'est pas à nous d'enregistrer ce champs.

    on va donc préciser les champs que l'on veux insérer, de cette manière, si on ne nomme pas id, on n'aura pas à mettre NULL, ou encore ''

    Code MySQL fonctionnel mais incorrect : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO marque
    VALUES
    (NULL,'Renault');

    Code MySQL fonctionnel, propre, et correct : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO marque(nom_marque)
    VALUES 
    ('Renault');

    si je débutait en MySQL, je me dirais (et c'est peut être une question que tu te pose) : ok, j'enregistre renault, mais comment je connais son id alors? je dois aller voir dans ma table à chaque fois pour savoir quel est le numéro d'identifiant de cette marque?

    Pour notre exemple, oui c'est qu'on va faire , on va aller voir dans la base de données quel numéro MySQL à mit

    Mais quand tu passera à ton vrai projet, tu crééra un script qui recuperera l'identifiant correspondant au nom d'une marque de manière automatique. enfin dans ton cas, tu ira chercher l'identifiant de la news correspondant au titre intel

    Maintenant qu'on connait l'identifiant de la marque renault, on peut se permettre d'insérer des véhicules de cette marque dans la table voiture :p
    on à vu que l'identifiant était 2 (c'est p'tete pas 2 hein! à toi d'aller voir )
    dans id_marque, on va donc mettre 2!

    Code MySQL fonctionnel mais incorrect : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO voiture
    VALUES
    ('','Renault',2,'SW');

    Code MySQL fonctionnel et correct : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO voiture(nom,id_marque,type_voiture)
    VALUES
    ('Renault',2,'SW');


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

Discussions similaires

  1. Champ Composition multiple et MySQL
    Par dimitrak dans le forum W4 Express
    Réponses: 2
    Dernier message: 24/08/2013, 08h44
  2. comment formater un champs dans table mysql
    Par rollly dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/04/2006, 14h31
  3. Copie champs Access vers MySQL
    Par DrSlump dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 02/11/2005, 17h31
  4. Recuperation variable champ selectionnable depuis mysql
    Par mulbek dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 19/10/2005, 12h11
  5. [TABLE][ENUM] u champs à choix multiple ?
    Par narmataru dans le forum SQL
    Réponses: 2
    Dernier message: 04/11/2003, 10h25

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