Enregistrer plusieurs checbox ensemble dans une BD [Résolu]

Signaler
Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020
-
 Busima -
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!.

5 réponses

Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020
2 488
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 :








Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020

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.
Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020
2 488
Ca dépend.
Tu pars sur quelle méthode parmi celles que j'ai proposé ?
Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020

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
Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020
2 488
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://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs

.
Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020

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?
Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020
2 488
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 = "";
}
Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020
>
Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020

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?
Messages postés
28972
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
4 juin 2020
2 488 >
Messages postés
54
Date d'inscription
mercredi 10 février 2016
Statut
Membre
Dernière intervention
2 avril 2020

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
Ok merci beaucoup.