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

Langage PHP Discussion :

Insérer la valeur d'un checkbox en base de donnée


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Insérer la valeur d'un checkbox en base de donnée
    Bonjour à la communauté,

    J'ai un projet de site Internet en cours qui consiste à présenter à des personnes des véhicules d'occasions en vente par une entreprise.
    Il y a une page d'ajout qui contient un formulaire avec les informations principales sous forme de champs à remplir(kilométrage, année de mise en circulation, puissance fiscale, marque) et les options associées sous forme de checkbox à cocher(GPS, airbag, ESP, FAP).

    Au niveau de la conception, j'ai donc décidé de créer deux tables : la première nommée : véhicule avec les informations suivantes (vehicule_id , vehicule_fk: clé étrangère liée à option_id de la table option, vehicule_kilometrage, vehicule_marque) et la seconde nommée : option (option_id, option_gps, option_airbag) ou les options sont des booléens.

    Ce que j'aimerais faire c'est si la case est cochée l'option passe à true et si elle ne l'est pas elle passé à false en base de données, j'aimerais faire l'ajout du véhicule et de ses options sur 2 requêtes distinctes sans avoir à ajouter les options une par une en faisant une requête par option.

    Comment je peut vérifier l'état de chaque checkbox et envoyer son état en base de données?

    Cordialement
    Romainb24

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Avoir les options "horizontalement" est une mauvaise structure.
    La principale raison est que l'ajout d'une option va nécessiter la modification de la table et la modification des requêtes.

    Une bonne structure relationnelle c'est

    - une table option qui va contenir les options possibles
    1 - GPS
    2 - Airbag
    3 - Cequetuveux

    - une table de liaison vehicule_option qui indique les options pour chaque vehicule
    id - vehicule_fk - option_fk
    1 - 1 - 1
    2 - 1 - 2

    (le vehicule 1 a un GPS et un Airbag)

    Une clef étrangère est une clef d'une table utilisée dans une autre table. Dans ton vehicule_fk ne vas pas dans la table vehicule.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    La manière dont tu comptes concevoir ta base de données semble pleine de bon sens au premier abord car sa motivation semble de vouloir éviter la redondance en ce qui concerne les jeux d'options possibles en utilisant deux tables distinctes et une clef étrangère. Ceci dit, j'attire ton attention sur le fait qu'avec MySQL le type boolean est en réalité un tiny int et que d'autre part, il est possible de représenter facilement un jeu de boolean avec un simple entier. Exemple:
    Code truc : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    AirBag : True
    GPS : False
    Correcteur électronique de trajectoire : True
    Mini bar : True
    Gyrophare : False

    En affectant une puissance de deux précise à chaque option, tu obtiens pour ce set le nombre binaire 01101, soit en décimal: 13 ( = 1x2^0 + 0x2^1 + 1x2^2 + 1x2^3 + 0x2^4).

    Conclusion, si tu peux représenter tout un jeu d'options avec un simple entier (et pas un bien gros, avec les 5 options ça fait 31, pas de quoi fouetter un chat), inutile de créer deux tables, il suffit d'ajouter une simple colonne pour représenter toutes les options. En plus, les "bitwise operations" (les opérations sur les binaires) sont très performantes et faciles à utiliser. Par exemple si je veux savoir si un véhicule a le mini bar, je fais en PHP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($options & 8) { ...
    (8 correspond à 2^3, la quatrième option. Rien n'empêche de définir une constante:define('MINI_BAR', '8'); pour éviter des valeurs magiques dans le code).
    Idem avec MySQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE options & 8 ...

    C'est ma suggestion, mais si tu cherches des conseils avisés sur le design de bases de données, pose une question sur le forum adéquate pour avoir l'avis d'experts sur le sujet.

    Pour ce qui est de récupérer l'état d'une checkbox pour la partie formulaire, je t'invite à consulter un tutoriel.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Pour les checkboxes, le principe est simple : cochée = on reçoit la valeur, non cochée = on ne reçoit rien.
    Tu peux donc construire ton script de cette façon :
    Pour la checkbox :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <input type="checkbox" name="abs" value="1">
    .
    On récupère la donnée (en supposant que le formulaire soit en méthode post) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $abs = 0; // non cochée par défaut
    if (!empty($_POST['abs'])) {
        $abs = 1; // cochée
    }
    et ensuite on utilise la variable ainsi initialisée dans la requête d'insertion/mise à jour.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Membre éclairé
    Homme Profil pro
    Webdesigner
    Inscrit en
    Juin 2014
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Juin 2014
    Messages : 417
    Points : 834
    Points
    834
    Par défaut
    Bonjour.
    Voilà ce que je ferais si j'avais à faire ce genre de travail. Ma solution permet de rajouter facilement des options au cours du temps sans avoir à modifier le code PHP.
    Il suffit à chaque option nouvelle d'ajouter une colonne portant le nom de l'option (value du checkbox ad hoc) dans le BDD et bien sûr d'ajouter le checkbox et son label dans le code HTML.
    J'ajoute que dans la BDD, la valeur par défaut de chaque option est 0 (ou false ou null...). Comme ça on ne s'occupe que de celles qui sont cochées, et on attribue 1 à celles qui le sont

    HTML :

    (Toutes les options ont le même nom, avec [] sauf la valeur est modifiée. j'ai un peu mis n'importe quoi)

    GPS<input type="checkbox" name="options[]" value="gps"><br>
    Radio CD<input type="checkbox" name="options[]" value="radio"><br>
    kit usb<input type="checkbox" name="options[]" value="usb"><br>
    Carte main libre<input type="checkbox" name="options[]" value="carte"><br>
    Autre<input type="checkbox" name="options[]" value="autre">

    En fait, pour la partie HTML, il est évident que pour bien travailler, les diverses options devraient être générées à partir d'une table (de la BDD) options
    le code du coup ressemblerait plutôt à :

    GPS<input type="checkbox" name="options[]" value="22"><br>

    PHP :
    if($_POST['options']) {
    foreach($_POST['options'] as $option)
    $insertopts .= ",$option = 1";
    }
    Il n'y a plus qu'à ajouter la chaine $insertopts à la requête d'insertion. Simple, non ?
    Après, j'ai rien fait côté sécurité...


    Par exemple si Radio CD et Carte main libre sont cochés, la chaine $insertopts contiendra : ", radio =1, carte = 1"

Discussions similaires

  1. [MySQL] Inscription checkbox en base de données.
    Par xjulio59 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/10/2010, 22h43
  2. Récupération valeur case à cocher dans la base de données
    Par jarod6827 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 09/04/2009, 12h25
  3. [MySQL] Retour valeur case à cocher depuis une base de données
    Par asvin dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/10/2008, 19h25
  4. Réponses: 3
    Dernier message: 17/03/2008, 00h46
  5. Réponses: 13
    Dernier message: 21/09/2005, 15h39

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