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 :

Formulaire PHP - gestion de données multiples cases à cocher


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut Formulaire PHP - gestion de données multiples cases à cocher
    Bonjour à vous,
    pour remplir une table My SQL, j'ai mis en place un formulaire php qui fonctionne sur un site wordpress.
    je ne vais pas vous exporter toute la structure de la table, mais pour une des rubriques, l'utilisateur peut avoir plusieurs choix disponibles dans des cases à cocher :
    voici l'extrait du formulaire de création :
    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
    <form method="POST" action="add_site-2">
    <div class="container">
    <h2>Ajouter un site archéologique</h2>
    <div class="form-row">
    <div class="form-group col-md-6"><label>Période principale</label> : 
    <div class="form-check">
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox1" value="Néolithique"><label class="form-check-label" for="Checkbox1">Néolithique</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox2" value="Age du Bronze"><label class="form-check-label" for="Checkbox2">Age du Bronze</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox3" value="Age du Fer"><label class="form-check-label" for="Checkbox3">Age du Fer</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox4" value="Antiquité"><label class="form-check-label" for="Checkbox4">Antiquité</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox5" value="Moyen-Age"><label class="form-check-label" for="Checkbox5">Moyen-Age</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox6" value="Période moderne"><label class="form-check-label" for="Checkbox6">Période moderne</label>
    <input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox7" value="Epoque contemporaine"><label class="form-check-label" for="Checkbox7">Epoque contemporaine</label>  
    </div>
    </div>
    </div><input type="submit" value="Ajouter ce site" name="envoyer"></p>
    </div>	
    </form>
    Par la suite, je récupère ces données pour les insérer dans la table MySQL avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach($_POST['periode_princ'] as $check)
    {
    if( !isset($checkoptions) ){ $checkoptions = $check; }
    else{ $checkoptions .= ",".$check; }
    }
    $connexion=include 'connexion_db.php';
    $insertion = $connexion->prepare ("INSERT INTO `site`(Periode_princ) VALUES('$checkoptions')");
    $insertion->execute();
    Tout cela fonctionne très bien et mes données sont bien stockées avec des virgules en séparateur. Le seul problème est que je voudrais faire un formulaire de modification de fiche qui remobiliserait ces données sous la forme de cases à cocher activées ou non en fonction des résultats déjà présents. Est-ce que quelqu'un aurait une idée de la marche à suivre ?

    J'ai le même problème pour une liste déroulante à choix multiples où j'aimerais que, dans un formulaire de modification, les données soient déjà activées en fonction des informations déjà entrées dans la base.

    Merci d'avance à la ou les personnes qui prendront le temps de me lire et de me répondre pendant ce confinement !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Déjà, on va simplifier l'affichage des checkbox :
    Code html : 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
    <div class="form-check">
    <?php
    $periodes_all = [
            "Néolithique",
            "Age du Bronze",
            "Age du Fer",
            "Antiquité",
            "Moyen-Age",
            "Période moderne",
            "Epoque contemporaine",
    ];
    foreach( $periodes_all as $ii => $periode )
    {
    ?>
    	<input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox<?=$ii;?>" value="<?=htmlspecialchars($periode);?>">
    	<label class="form-check-label" for="Checkbox<?=$ii;?>"><?=htmlspecialchars($periode);?></label>
    <?php
    }
    ?>
    </div>

    Citation Envoyé par Clement_archeo Voir le message
    ...mes données sont bien stockées avec des virgules en séparateur...
    Bien que ce ne soit pas la meilleure méthode *, on va supposer qu'on part de là.
    * Normalement, on utilise une autre table, et on fait une JOINTURE

    Donc, le contenu de la colonne dans la table est du genre : "Néolithique,Age du Fer,Période moderne"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Periode_princ = "Néolithique,Age du Fer,Période moderne";

    1- Pour pré-cocher les bonnes cases :
    • il faut commencer par explode(), avec comme séparateur la virgule
    • ensuite, grâce à in_array(), on vérifie pour chaque checkbox

    Code html : 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
    <div class="form-check">
    <?php
    // array des périodes (issu de la BDD)
    $Periode_princ_array = explode(',', $Periode_princ); 
     
    // Toutes les périodes
    $periodes_all = [
            "Néolithique",
            "Age du Bronze",
            "Age du Fer",
            "Antiquité",
            "Moyen-Age",
            "Période moderne",
            "Epoque contemporaine",
    ];
    foreach( $periodes_all as $ii => $periode )
    {
            $checked = ( !empty($Periode_princ_array) && in_array($periode, $Periode_princ_array) )? 'checked="checked=' : ''; // si in_array : on coche
    ?>
    	<input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox<?=$ii;?>" value="<?=htmlspecialchars($periode);?>"<?=$checked;?>>
    	<label class="form-check-label" for="Checkbox<?=$ii;?>"><?=htmlspecialchars($periode);?></label>
    <?php
    }
    ?>
    </div>

  3. #3
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut
    Super !
    merci beaucoup jreaux62 pour cette méthode qui fonctionne très bien pour sur le fond. J'ai adapté en fonction de mes données, et ça marche nickel pour les cases à cocher ou non.
    Par contre, au niveau de la mise en forme, ça déconne un peu. Normalement, les cases devraient être en colonne, mais elles sont en ligne, j'ai donc rajouté un petit <br> dans le foreach pour compenser cela. ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    foreach( $periodes_all as $ii => $periode )
    {
    ?>
    	<input class="form-check-input" name="periode_princ[]" type="checkbox" id="Checkbox<?=$ii;?>" value="<?=htmlspecialchars($periode);?>">
    	<label class="form-check-label" for="Checkbox<?=$ii;?>"><?=htmlspecialchars($periode);?></label><br>
    <?php
    }
    ?>
    Par contre, c'est bizarre, mais les textes ne sont pas alignés sur les cases à cocher, ça donne ça : Nom : copie2.png
Affichages : 315
Taille : 8,8 Ko

    Autrement, pour la remarque :
    Bien que ce ne soit pas la meilleure méthode *, on va supposer qu'on part de là.
    * Normalement, on utilise une autre table, et on fait une JOINTURE
    je suis tout àa fait d'accord, et j'ai beaucoup hésité. Pour un autre champ de la même table qui est enregistré sous forme de liste déroulante, j'ai par ailleurs opté pour une jointure et je me retrouve dans le même cas de figure comme j'avais mis dans mon premier message. Mais là, par contre, je ne sais pas si je peux rendre déjà activés des valeurs d'une liste déroulante sur le même principe que les cases à cocher

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- pour les décalages, normalement il ne devrait pas en avoir.
    Il faut voir ce que tu as mis dans les classes "form-check-input" et "form-check-label".
    Sinon :
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    input[type="checkbox"], input[type="checkbox"] + label {
        margin: 0 2px 0 0;
        padding: 0;
        line-height: 1.2em;
    }

    2- Normalement, tu devrais avoir une TABLE "T_PERIODES" :
    • id_periode
    • nom_periode


    Au lieu de construire l'array...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $periodes_all = [
            "Néolithique",
            "Age du Bronze",
            "Age du Fer",
            "Antiquité",
            "Moyen-Age",
            "Période moderne",
            "Epoque contemporaine",
    ];
    ... on effectue une requête sur la table "T_PERIODES".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $sql = "SELECT id_periode, nom_periode FROM T_PERIODES";
    $query = $bdd->query($sql);
    $row_periodes_all = $query->fetchAll();
    foreach( $row_periodes_all as $row_periode )
    {
            $checked = ( !empty($Periode_princ_array) && in_array($periode, $Periode_princ_array) )? 'checked="checked=' : ''; // si in_array : on coche
    ?>
    	<input class="form-check-input" name="periode_princ_id[]" type="checkbox" id="Checkbox<?=$row_periode['id_periode'];?>" value="<?=htmlspecialchars($row_periode['id_periode']);?>"<?=$checked;?>>
    	<label class="form-check-label" for="Checkbox<?=$row_periode['id_periode'];?>"><?=htmlspecialchars($row_periode['nom_periode']);?></label>
    <?php
    }
    ?>
    Et ce sont les id qu'on enregistre en Bdd, PAS les noms.
    Dernière modification par Invité ; 16/04/2020 à 09h36.

  5. #5
    Membre confirmé
    Homme Profil pro
    Archéologue
    Inscrit en
    Mars 2019
    Messages
    134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Archéologue
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mars 2019
    Messages : 134
    Par défaut
    en fait ces class form-check-input et form-check-label sont des class bootstrap, donc je ne comprends pas pourquoi il y a ce décalage...m'enfin...

  6. #6
    Invité
    Invité(e)
    Par défaut
    • Vérifie le code source généré ("Ctrl"+"U"),
    • et regarde dans l'inspecteur ("F12")

    Et en effet, Boostrap n'a rien à voir dans ce souci-ci.

Discussions similaires

  1. Test sur multiple cases à cocher
    Par Gueuz dans le forum Langage
    Réponses: 5
    Dernier message: 24/02/2009, 10h55
  2. formulaire / php / base de données et classes
    Par No3l_tek dans le forum Langage
    Réponses: 1
    Dernier message: 30/04/2008, 09h52
  3. [PHP-JS] Données des cases à cocher perdues
    Par NinieAlucard dans le forum Langage
    Réponses: 2
    Dernier message: 02/01/2008, 15h24
  4. formulaire / php / base de données
    Par amandine_drooplette dans le forum Langage
    Réponses: 6
    Dernier message: 07/06/2007, 13h14
  5. [MySQL] Creer un formulaire avec un tableau et des cases à cocher ??
    Par shawn12 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/04/2006, 10h23

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