Enregistrer plusieurs checbox ensemble dans une BD

Résolu/Fermé
Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021 - Modifié le 31 mars 2020 à 22:45
 Busima - 10 avril 2020 à 23:18
Bonjour,
Je suis entrain de créer un formulaire de demande de devis en PHP.
Mon problème se situe au niveau des checkbox car je veux donner la possibilité à l'utilisateur de pouvoir sélectionner plusieurs checkbox ensemble comme choix.
Par exemple: choix1: "Agents de sécurité", Choix2: "Maitre chien", choix3: "Agent évènementiel", choix4: "Agent de sécurité incendie", ...
Je veux que l'utilisateur puisse sélectionner par exemple, choix1, choix2 et choix3 ensemble et cliquer sur envoyer pour les enregistrer dans ma BD lorsqu'il clique sur "Envoyer".

Pour ce faire, j'ai déjà réalisé la partie HTML que voici:

<form method="POST" action="valider-demandedevis.php" id="contactdevis">
                 <h5 class="text-center">Informations du Client </h5>
                 <div class="border"></div>
                 <br>
                 <div class="row">
                  <div class="col-md-6">
                   
                   <div class="form-group">
                    <span class="form-control-static">Votre nom ou nom de votre société </span>
                    <input type="text" class="form-control" name="nom_prospect" placeholder="Nom *" id="nomc" required data-validation-required-message="Entrez votre nom">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>
                   <div class="form-group">
                    <span class="form-control-static">Prénom   </span>
                    <input type="text" class="form-control" name="prenom_prospect" placeholder="Votre prenom (facultatif)" id="prenom">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>

                   <div class="form-group">
                    <span class="form-control-static">Fonction    </span>
                    <input type="text" class="form-control" name="fonction_prospect" placeholder="Votre fonction *" id="fonction" required data-validation-required-message="Entrez votre fonction">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>

                  </div>
                  <div class="col-md-6">
                   <div class="form-group">
                    <span class="form-control-static">Votre Service s'il s'agit d'une société(facultatif)    </span>
                    <input type="text" class="form-control" name ="service_prospect" placeholder="Votre Service" id="service">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>
                   <div class="form-group">
                    <span class="form-control-static">Email </span>
                    <input type="email" class="form-control" name= "email_prospect" placeholder="Votre email *" id="emailc" required data-validation-required-message="Entrez votre email">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>
                   <div class="form-group">
                    <span class="form-control-static">Téléphone </span>
                    <input type="text" class="form-control" name="telephone_prospect" placeholder="Téléphone *" id="tel" required data-validation-required-message="Entrez votre Téléphone">
                    <span class="help-block text-danger" style="color: red;"></span>
                   </div>
                  </div>
                 </div>

                  <h5 class="text-center">Prestations   </h5>
                  <div class="border"></div>
                  <br>
                  <div class="col-lg-12">
                  <div class="form-group">
                   <h6 style="font-weight: bold; font-style: italic">Quels types d’agents de sécurité recherchez-vous ?    </h6>
                   
                     <input type="checkbox" name="type_agent[]" id="agent_securite" value="Agent de sécurité"> Agents de sécurité<br>
                  
                     <input type="checkbox" name="type_agent[]" id="maitre_chien" value="Maitre chien"> Maitre chien <br>
                  
                     <input type="checkbox" name="type_agent[]"  id="agent_evenementiel" value="Agent évènementiel"> Agent évènementiel <br>
                  
                     <input type="checkbox" name="type_agent[]" id="secure_incendie" value="Agent  de sécurité incendie"> Agent de sécurité incendie <br>
                  
                     
                  </div>

                   <div class="form-group">

                   <h6 style="font-weight: bold; font-style: italic">Quel type d’espace souhaitez-vous sécuriser ?    </h6>

                   <ul class="gfield_checkbox"  name="espace"  id="espace">

                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="bureau" value="Bureau" class="cb" tabindex="13">
                     <label for="espace_a_securiser[]">Bureaux</label> </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="espace" value="Entrepôt / usine" class="cb" tabindex="14">
                     <label for="espace_a_securiser[]">Entrepôt / usine</label>
                    </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="diner" value="Café/Hotel/Restaurant" class="cb" tabindex="15">
                     <label for="espace_a_securiser[]">Café/Hotel/Restaurant</label>
                    </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="mag" value="Commerce/Magasin/Hypermarché/Grande surface " class="cb" tabindex="16">
                     <label for="espace_a_securiser[]">Commerce/Magasin/Hypermarché/Grande surface </label>
                    </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="exposition" value="Salons/Foire/Exposition" class="cb" tabindex="17">
                     <label for="espace_a_securiser[]">Salons/Foire/Exposition </label>
                    </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="parking" value="Parking" class="cb" tabindex="17">
                     <label for="espace_a_securiser[]">Parking </label>
                    </li>
                    <li>
                     <input type="checkbox" name="espace_a_securiser[]" id="autre" value="Autre" class="cb" tabindex="17">
                     <label for="espace_a_securiser[]">Autre</label>
                    </li>
                   </ul>
                   </div>
                   <div class="form-group">

                    <h6 style="font-weight: bold; font-style: italic">Combien d’agents souhaitez-vous ?    </h6>

                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio"  id="un_agent" name="nbre_agent" value="1" checked> 1
                    </label>
                   
                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio" id="deux_agents" name="nbre_agent" value="2" > 2
                    </label>
                   
                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio" id="trois_agents" name="nbre_agent" value="3"  > 3
                    </label>
                   
                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio" id="quatre_agents" name="nbre_agent" value="4"   > 4
                    </label>
                   
                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio" id="cinq_agents" name="nbre_agent" value="5"  > 5
                    </label>
                   
                    <label for="nbre_agent" class="radio-inline">
                    <input type="radio"  id="plusieurs_agents" name="nbre_agent" value="plus"  > plus
                    </label>
                   </div>
                  <div class="form-group">

                   <h6 style="font-weight: bold; font-style: italic">Quand la prestation devrait débuter ?    </h6>
                   <label for="delai" class="radio-inline">
                    <input type="radio" name="delai" id="prestation1" value="Urgent" checked> Urgent
                   </label>
                   <label for="delai" class="radio-inline">
                    <input type="radio" name="delai" id="prestation2" value="Sous un mois"> Sous un mois
                   </label>
                   <label for="delai" class="radio-inline">
                    <input type="radio" name="delai" id="prestation3" value="De 1 à 3 mois"> De 1 à 3 mois
                   </label>
                   <label for="delai" class="radio-inline">
                    <input type="radio" name="delai" id="prestation4" value="Plus de 3 mois"> Plus de 3 mois
                   </label>
                  </div>
                  <div class="form-group">
                   <span class="form-control-static">Autre / demande particulière  </span>
                   <textarea class="form-control" name="demande_particuliere" placeholder="Autre / demande particulière *" id="dp" style="resize: none"></textarea>
                   <span class="help-block text-danger" style="color: red;"></span>
                  </div>
                  <div class="col-lg-12 text-center">
                   <input type="submit" id="envoyer"  name ="envoyer" value="ENVOYER" class="btn btn-primary">
                  </div>
                  
                  <br>
                  </div>
                 </form>


Il reste la partie traitement en PHP pour les enregistrements des checkbox dans la BD.
Je sais que que j'ai mal codé la partie de récupération des checkbox. Donc je sollicite votre aide pour la correction de mon code que voici ci-dessous:
Code :
if((!empty($_POST['nom_prospect']) AND !empty($_POST['email_prospect']) AND !empty($_POST['telephone_prospect']) AND isset($_POST['envoyer'])))
           {
            $nom_prospect = $_POST["nom_prospect"];
            $prenom_prospect = $_POST["prenom_prospect"];
            $fonction_prospect = $_POST["fonction_prospect"];
            $service_prospect = $_POST["service_prospect"];
            $email_prospect = $_POST["email_prospect"];
            $telephone_prospect = $_POST["telephone_prospect"];
            $nbre_agent = $_POST["nbre_agent"];
            $delai = $_POST["delai"];
            $demande_particuliere = $_POST["demande_particuliere"];
            /*DEBUT DE l'ERREUR*/
            foreach($_POST["type_agent"] as $type_agent)
            {
             $type_agent=$_POST["type_agent"];
            }
                 
      foreach($_POST["espace_a_securiser"] as $espace_a_securiser)
            {
             $espace_a_securiser=$_POST["espace_a_securiser"];
            }
            /*FIN DE l'ERREUR*/
            $req = $bdd->prepare('INSERT INTO demande_de_devis (nom_prospect, prenom_prospect, fonction_prospect, service_prospect, email_prospect, telephone_prospect, type_agent, espace_a_securiser, nbre_agent, delai, demande_particuliere) VALUES (:nom_prospect, :prenom_prospect, :fonction_prospect, :service_prospect, :email_prospect, :telephone_prospect, :type_agent, :espace_a_securiser, :nbre_agent, :delai, :demande_particuliere)');
            $req->execute(array(':nom_prospect'=>$nom_prospect, ':prenom_prospect'=>$prenom_prospect, ':fonction_prospect'=>$fonction_prospect, ':service_prospect'=>$service_prospect,':email_prospect'=>$email_prospect,':telephone_prospect'=>$telephone_prospect, ':type_agent'=>$type_agent, ':espace_a_securiser'=>$espace_a_securiser, ':nbre_agent'=>$nbre_agent, ':delai'=>$delai, ':demande_particuliere'=>$demande_particuliere))
            or die (print_r($req->errorInfo()));
            $req->closeCursor();
            echo "<p>  Votre demande de devis a bien été envoyé!</br></br>
                        Nous la traiterons et nous vous contacterons dans un délais maximum de 48h. </br>
                        Cependant n'hésitez pas à nous recontacter au cas ou nous ne respectons pas ce délais maximum de 48h.</p></br></br>
            
                 <a href='contact.php'>RETOUR</a>";
           }else
            { 
             echo "Veuillez remplir tous les champs obligatoires!</br></br>
             <a href='demander-devis.php'>RETOUR</a>";
            }
            

Je sais que le problème se trouve dans la partie de la boucle foreach que je n'ai pas su gérer et que j'ai encadrée par /*DEBUT DE l'ERREUR*/ ... ........................... /*DEBUT DE l'ERREUR*/.
En effet ce sont des tableaux que j'ignore comment récupérer et enregistrer dans la base de données. N'oubliez pas de me dire aussi comment les récupérer de la base de données après l'enregistrement pour les afficher sur une page web comme résultat de requête de sélection.
Merci!.
A voir également:

5 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
31 mars 2020 à 23:00
Bonjour,

Deux possibilités :
Tu veux absolument garder cette structure de base de données... (donc un seul champ pour stocker tes "type_agent"
et dans ce cas, tu peux serializer l'array
$type_agent = !empty($_POST["type_agent"]) ? serialize($_POST["type_agent"]) : "";

ou sinon tu convertis au format json
$type_agent = !empty($_POST["type_agent"]) ? json_encode($_POST["type_agent"]) : "";


Dans les deux cas, ça transformera l'array en chaine de text..

Mais, le problème en enregistrant les données comme ça dans un seul champ.. c'est si tu as besoin de faire ensuite des recherches dans la bdd....

Ce qui nous amène au second choix.
Revoir la structure de tes tables.

Ta Bdd devrait ressembler à ça :








0
Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021 1
1 avril 2020 à 23:58
Merci beaucoup pour ta réponse Jordane. Une fois de plus encore tu me sauves.
Cependant je te sollicite afin que tu traduises ton code en un code plus simple comme le mien avec des if (isset...) comme je la'i fait là, si possible:
if((!empty($_POST['nom_prospect']) AND !empty($_POST['email_prospect']) AND !empty($_POST['telephone_prospect']) AND isset($_POST['envoyer'])))
           {
            $nom_prospect = $_POST["nom_prospect"];
            $prenom_prospect = $_POST["prenom_prospect"];
            ...
            $demande_particuliere = $_POST["demande_particuliere"];

            /*DEBUT DE l'ERREUR*/
            foreach($_POST["type_agent"] as $type_agent)
            {
             $type_agent=$_POST["type_agent"];
            }
                 
      foreach($_POST["espace_a_securiser"] as $espace_a_securiser)
            {
             $espace_a_securiser=$_POST["espace_a_securiser"];
            }
            /*FIN DE l'ERREUR*/

            $req = $bdd->prepare('INSERT INTO demande_de_devis (nom_prospect, prenom_prospect, fonction_prospect, service_prospect, email_prospect, telephone_prospect, type_agent, espace_a_securiser, nbre_agent, delai, demande_particuliere) VALUES (:nom_prospect, :prenom_prospect, :fonction_prospect, :service_prospect, :email_prospect, :telephone_prospect, :type_agent, :espace_a_securiser, :nbre_agent, :delai, :demande_particuliere)');
            $req->execute(array(':nom_prospect'=>$nom_prospect, ':prenom_prospect'=>$prenom_prospect, ':fonction_prospect'=>$fonction_prospect, ':service_prospect'=>$service_prospect,':email_prospect'=>$email_prospect,':telephone_prospect'=>$telephone_prospect, ':type_agent'=>$type_agent, ':espace_a_securiser'=>$espace_a_securiser, ':nbre_agent'=>$nbre_agent, ':delai'=>$delai, ':demande_particuliere'=>$demande_particuliere))
            or die (print_r($req->errorInfo()));
            $req->closeCursor();

Cela me facilitera la compréhension et l'implémentation.
Encore merci et excuse moi si je demande trop.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 avril 2020 à 07:37
Ca dépend.
Tu pars sur quelle méthode parmi celles que j'ai proposé ?
0
Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021 1
2 avril 2020 à 14:49
Je vais faire les 2 méthodes mais je vais commencer par la 1ére méthode, c'est à dire garder cette structure de base de données et serializer l'array comme tu le dis ici:
$type_agent = !empty($_POST["type_agent"]) ? serialize($_POST["type_agent"]) : "";
ou sinon tu convertis au format json
$type_agent = !empty($_POST["type_agent"]) ? json_encode($_POST["type_agent"]) : "";

pour transformer l'array en chaine de text...

Après cela, je vais passer au second choix en revoyant la structure de mes tables comme tu me l'as proposé également.
Pour l'instant il faut me montrer comment traduire tes codes suivants comme moi je code là:
$type_agent = !empty($_POST["type_agent"]) ? serialize($_POST["type_agent"]) : "";
ou sinon tu convertis au format json
$type_agent = !empty($_POST["type_agent"]) ? json_encode($_POST["type_agent"]) : "";
en utilisant le if (isset...).
Merci
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 avril 2020 à 15:04
il n'y a pas 2 ... mais 3 méthodes proposées
- Serializer
- Transformer en JSON
- Changer la structure de la bdd (ce qui serait largement plus propre et efficace).

Pour les deux premières méthodes, j'ai utilisé l'écriture TERNAIRE.
En gros.. c'est un IF ELSE mais qui s'écrit en une seule ligne.

Converti à l'ancienne ça donne
if( !empty($_POST["type_agent"]) ){
   $type_agent = json_encode($_POST["type_agent"]) ;
} else {
   $type_agent = "";
}


Je t'invite également à lire ET à appliquer les conseils donnés dans ces deux liens :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs

.
0
Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021 1
2 avril 2020 à 17:13
J'ai choisi la 1ère méthode de serialization pour le champ "type-agent" et voici ce qu'il m'affiche dans le champ comme enregistrement que je n'arrive pas lire. j'ai pourtant changé son format "varchar" en format "text" et l'encodage "utf8_general_ci" en "utf8_unicode_ci":

["Agent de s\u00e9curit\u00e9","Maitre chien","Agent de s\u00e9curit\u00e9 incendie"]

Et voici la 2ème méthode avec le "json_encode" pour le champ "espace_a_securiser" et voici ce que m'affiche aussi le champ comme enregistrement que je n'arrive pas lire également:

a:3:{i:0;s:6:"Bureau";i:1;s:22:"Café/Hotel/Restaurant";i:2;s:7:"Parking";}

Comment rendre lisibles les enregistrements de ces 2 champs?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
2 avril 2020 à 17:23
Tu ne peux pas les rendre "lisible" directement dans ta bdd....
Par conte, si tu dois les utiliser dans un code php, il suffira de faire du json_decode ou du unserialize (en fonction de la méthode d'encodage choisi ).

Sinon, tu peux aussi juste les stocker en "valeurs" séparées par des virgules
Par exemple
if( !empty($_POST["type_agent"]) && is_array($_POST["type_agent") ){
   $type_agent =join(",", $_POST["type_agent"]) ;
} else {
   $type_agent = "";
}
0
Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021 1 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
Modifié le 2 avril 2020 à 18:06
Ok merci Jordane. Cela marche très bien.
Je vais continuer le projet et je vous ferai un retour au cas ou je décide de faire la 3ème méthode en révisant la BD.
Cependant, je veux mettre la question en "résolue", mais avant de le faire, je veux que tu me dises comment "unserializer" et comment "json_decoder" pour la récupération des données?

Est-ce que c'est:
1- SELECT * FROM demande_de_devis AND (unserialize(type_agent));
ou
2- SELECT (unserialize(type_agent));?
Et pourle js_decode aussi?
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > Busima Messages postés 55 Date d'inscription mercredi 10 février 2016 Statut Membre Dernière intervention 29 janvier 2021
8 avril 2020 à 21:05
Ces instructions se font en PHP uniquement
D'une part tu fais ta requête SELECT,
Puis, une fois le résultat stocké dans une variable PHP tu peux appliquer le unserialze ou le json_decode
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ok merci beaucoup.
0