Bonjour,
Voila je rencontre un petit problème avec mon code.
J'aimerais qu'un utilisateur qui se connecte à son compte et qui souhaite modifier ses informations d'inscription tombe sur un formulaire prérempli avec les infos qu'il avait saisies avant, lors de son inscription et qui sont stockés en BDD.
J'arrive à bien gérer tous les champs (text, textarea, select, radio) sauf le cas des champs checkbox.
Prenons l'exemple des cases à cocher des pôles souhaités.
Mon formulaire d'inscription ressemble à ça :
Lien pour voir à quoi ressemble le formulaire d'inscription
Le HTML / PHP associé à cette section est celui-là :
<div class="col-12 form-check"> <!-- POLE SOUHAITE -->
<p class ="poleSouhaite">Dans quel(s) pôle(s) souhaiteriez vous aller ?<span class="etoile">*</span></p>
<p id="poleDetail" class="col-12 form-text-top">Plusieurs réponses possibles</p>
<?php
$choices = ['Pôle A'=> 1,'Pôle B'=> 2,'Pôle C'=>3,'Pôle D'=> 4];
foreach ($choices as $key => $choice){
?>
<label id="poleSouhaiteLabel">
<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>"/>
<?php echo $key .' '; ?>
</label> </br>
<?php
}
?>
Mon utilisateur choisit donc une liste de pôle. Ces infos sont stockées en BDD grâce à une table d'association "choisir" qui est entre la table "utilisateurs" et la table "choix_equipe_utils".
La table "choisir" est composée de deux colonnes "id_choix_equipe_util" et "id_utilisateur".
La table "choix_equipe_utils" est composée de deux colonnes "id_choix_equipe_util" et "nom_choix_equipe".
Au final, je sais donc toutes les cases qu'a cochées tel utilisateur, et donc à quel pôle cela correspond.
Voici ma fonction qui insère cela en BDD :
function formulaireRempli() {
if(getErrors()) return header('Location:index.php?inscrire=inscrire');//si y'a une erreur je réaffiche le formulaire d'inscription
$data = prepareData();
$bdd = connect();
$request = $bdd->prepare(//je prépare la 1er requête d'insertion dans la table utilisateur
'INSERT INTO utilisateurs (email_utilisateur,nom_utilisateur)
VALUES(:email,:nom)'
);
$request->execute([ //j'éxecute la requête
':email' => $data['emailinput'],
':nom' => $data['nominput'],
]);
$user_id = $bdd->lastInsertId();
if($poleSouhaite = 1){
foreach($data['poleSouhaitecheckbox'] as $poleSouhaite){
switch ($poleSouhaite) {
case 1:
$poleSouhaite=1;
break;
case 2:
$poleSouhaite=2;
break;
case 3:
$poleSouhaite=3;
break;
case 4:
$poleSouhaite=4;
break;
default:
break;
}
$request3 = $bdd->prepare('INSERT INTO choisir (id_choix_equipe_UTIL, id_utilisateur)VALUES (:id_choix_equipe_UTIL,LAST_INSERT_ID())');
$request3->execute([':id_choix_equipe_UTIL'=> $poleSouhaite]);
}
}
return header('Location:index.php?confirmationCompte=confirmation_compte_benevole');exit();
}//fin fonction formulaireRempli
Ensuite, la personne se connecte à son compte, elle accède à son espace personnel où elle voit ce qu'elle a rempli comme infos dans la BDD. (Sur cette partie-là, je n'ai aucun problème, le nom des pôles que la personne a coché s'affiche correctement).
Pour cela, le code est le suivant :
if(isset($_SESSION['id_utilisateur']))
{
$bdd = connect();
// Requete SQL pour tous les champs
$requser =$bdd->prepare('SELECT * FROM utilisateurs WHERE id_utilisateur=?');
$requser->execute(array($_SESSION['id_utilisateur']));
$user=$requser->fetch();
// Requete SQL pour les poles choisis
$requserpole =$bdd->prepare('SELECT * FROM utilisateurs LEFT JOIN choisir ON utilisateurs.id_utilisateur=choisir.id_utilisateur LEFT JOIN choix_equipe_utils ON choisir.id_choix_equipe_UTIL=choix_equipe_utils.id_choix_equipe_UTIL WHERE utilisateurs.id_utilisateur=?');
$requserpole->execute(array($_SESSION['id_utilisateur']));
?>
<div class="heading">
<h2>Mes cordonnées</h2>
<div class="info paragrapheSousTitre">
<span id="introFormBenevole">Bonjour <?php echo $user['prenom_utilisateur'];?>, </br>
Bienvenue sur ton compte de bénévole.</span></br>
<p>bla bla bla</p>
</div>
<div class="col-12 form-group">
<div class="lesBoutonsCompteTop">
<button type="submit" id="boutonModifierCompte" name="boutonModifierCompte" value="1">Modifier mon compte</button>
<button type="reset" id="boutonSupprimerCompte" name="boutonSupprimerCompte" value="Effacer">Supprimer mon compte</button>
</div>
</div>
</div>
<div class="col-12 form-group">
<p id="poleSouhaitebene">Dans quel(s) pôle(s) souhaiteriez vous aller ?</p>
<?php
while ($userpole=$requserpole->fetch()){
?>
<p id="poleSouhaitecontenu"><?php echo $userpole['nom_choix_equipe'];?></p>
<?php
}
$requserpole->closeCursor();
?>
</div>
Et le rendu de cette page qui ne sert que d'affichage et d'information est le suivant :
Lien pour voir à quoi ressemble l'affichage simple des infos
Puis, cette personne veux changer des infos, elle clique sur le bouton de modification, et là, le même formulaire que celui d'inscription s'affiche, mais il faut qu'il soit prérempli, et je n'arrive pas à faire en sorte que les cases à cocher correspondantes au pôle qu'il souhaite soient déjà précochées.
Et pour le moment, je n'arrive pas à le préremplir en fonction de la BDD.
Je suis quasi certaine que je cherche trop compliqué, alors que ça doit être relativement simple. Mais impossible de trouver comment faire. J'ai besoin de vos lumières s'il vous plait !
Merci d'avance !
Me voilà de retour avec une réussite !
Donc un grand merci Balsakup de m'avoir bien aidé pour trouver comment faire.
A base de tests, de vardump, de modifs et de correction de bêtises, voici le code qui fonctionne pour moi :
<div class="col-12 form-check"> <!-- POLE SOUHAITE -->
<p class ="poleSouhaite">Dans quel(s) pôle(s) souhaiteriez vous aller ?<span class="etoile">*</span></p>
<p id="poleDetail" class="col-12 form-text-top">Plusieurs réponses possibles</p>
<?php
//Liste des pôles
$choices = ['Pôle A'=> 1,'Pôle B'=> 2,'Pôle C'=>3,'Pôle D'=> 4];
//Stockage des pôles
$userChoices = $requserpole->fetchAll();
$userChoicesId = array_column($userChoices, 'id_choix_equipe_UTIL');
foreach ($choices as $key => $choice){
$userChoiceIsChecked = in_array($choice, $userChoicesId);
?>
<label id="poleSouhaiteLabel">
<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>" <?php
if ($userChoiceIsChecked==true)echo 'checked="checked"';?> />
<?php echo $key .' '; ?>
</label> </br>
<?php
}
?>
A présent, j'obtiens donc les bonnes cases à cocher déjà cochées en fonction de ce qui est renseigné en BDD par l'utilisateur lors de son inscription !
Objectif atteint !
Merci encore Balsakup et Lolo3129 pour votre aide !
Salut,
Ca doit faire quelque chose comme ce qui suit, à peaufiner, j'ai pas testé si ça fonctionne, mais la logique devrait être bonne.
// Liste de pôles
$choices = ['Pôle A'=> 1,'Pôle B'=> 2,'Pôle C'=>3,'Pôle D'=> 4];
// Sélection des pôles de l'utilisateur
$requserpole =$bdd->prepare('SELECT * FROM utilisateurs LEFT JOIN choisir ON utilisateurs.id_utilisateur=choisir.id_utilisateur LEFT JOIN choix_equipe_utils ON choisir.id_choix_equipe_UTIL=choix_equipe_utils.id_choix_equipe_UTIL WHERE utilisateurs.id_utilisateur=?');
$requserpole->execute(array($_SESSION['id_utilisateur']));
// Stockage des pôles
$userChoices = $requserpole->fetchAll();
$userChoicesId = array_column($userChoices, 'id_choix_equipe_util');
foreach ($choices as $name => $value) {
$userChoiceIsChecked = in_array($value, $userChoicesId);
echo '<input type="checkbox" ... ' . $userChoiceIsChecked ? 'checked' : '' . '>';
}
Bonjour Balsacup et lolo3129,
Je vous remercie pour vos réponses.
Balsacup,
je comprends pour le stockage des pôles sous formes de variable. Je n'y avais tout simplement pas pensé.
Par contre, je ne comprends pas la syntaxe de te dernière ligne. Pourrais tu me l'expliquer un peu plus s'il te plait ?
echo '<input type="checkbox" ... ' . $userChoiceIsChecked ? 'checked' : '' . '>';
Et comme dit Lolo3129, ne faudrait-il pas mettre checked="checked"
pour cocher la case ?
Les 3 petits points c'est que j'avais la flemme d'écrire tout x)
$userChoiceIsChecked ? 'checked' : ''
=> condition ternaire, si le choix est associé à l'utilisateur, alors on check le champs, sinon rien.
Et comme dit Lolo3129, ne faudrait-il pas mettre checked="checked" pour cocher la case ?
checked
ou checked="checked"
revient à la même chose, par convention, en html, si un attribut n'a pas de valeur, on met le nom de l'attribut en valeur.
Pour les petits points, j'avais compris ! C'était la condition ternaire qui me faisait défaut (trop longtemps que je n'avais pas vu ça).
Et je ne savais pour pour le checked ou checked="checked".
Quand je teste avec ton code, de la façon suivante,
<p class ="poleSouhaite">Dans quel(s) pôle(s) souhaiteriez vous aller ?<span class="etoile">*</span></p>
<p id="poleDetail" class="col-12 form-text-top">Plusieurs réponses possibles</p>
<?php
//Liste des pôles
$choices = ['Pôle A'=> 1,'Pôle B'=> 2,'Pôle C'=>3,'Pôle D'=> 4];
//Sotckage des pôles
$userChoices = $requserpole->fetchAll();
$userChoicesId = array_column($userChoices, 'id_choix_equipe_util');
foreach ($choices as $key => $choice){
$userChoiceIsChecked = in_array($choice, $userChoicesId);
?>
<label id="poleSouhaiteLabel">
<?php echo '<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>" '.$userChoiceIsChecked ? 'checked' : ''.'/>';
echo $key .' '; ?>
</label> </br>
<?php
}
?>
J'obtiens :
Test 1
Alors j'ai tenté ça :
foreach ($choices as $key => $choice){
$userChoiceIsChecked = in_array($choice, $userChoicesId);
?>
<label id="poleSouhaiteLabel">
<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>" <?php $userChoiceIsChecked ? 'checked' : ''?>/>
<?php echo $key .' '; ?>
</label> </br>
<?php
}
?>
Mais je n'obtiens que des cases à cocher vide et le nom de mes poles à côté, donc comme avant.
Du coup, en me basant sur ce que j'ai fait pour les boutons radio, et avec tes modifiations, j'ai tenté ça :
foreach ($choices as $key => $choice){
$userChoiceIsChecked = in_array($choice, $userChoicesId);
?>
<?php echo $userChoiceIsChecked; ?>
<label id="poleSouhaiteLabel">
<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>" <?php
if (isset($userChoiceIsChecked))echo 'checked="checked"';?> />
<?php echo $key .' '; ?>
</label> </br>
<?php
}
?>
Là toutes les cases se coche ...
Donc, un petit var dump pour voir ce qu'il y a dans $userChoiceIsChecked :
foreach ($choices as $key => $choice){
$userChoiceIsChecked = in_array($choice, $userChoicesId);
?>
<?php var_dump( $userChoiceIsChecked); ?>
<label id="poleSouhaiteLabel">
<input type="checkbox" id="poleSouhaitecheckbox" class="form-check-input" name="poleSouhaitecheckbox[]" value="<?php echo $choice; ?>" <?php
if (isset($userChoiceIsChecked))echo 'checked="checked"';?> />
<?php echo $key .' '; ?>
</label> </br>
<?php
}
?>
Et là j'obtiens 4 jolis bool(false).
Test 2 avec var dump
Donc, $userChoiceIsChecked ne récupère pas de bonne infos.
Aurais tu une idée du pourquoi ?
Je ferais d'autres tests ce soir sur les variables.
Merci de ton aide précieuse !