Enregistrer la valeur d'une case a cocher

Ce topic a été résolu
quenquen147

quenquen147 Le 23 avril 2017 à 17:22 (Édité le 25 janvier 2019 à 17:53)

Bonjour,

J'ai un problème avec une case à cocher, je ne sais pas comment faire pour enregistrer sa valeur dans le cas où elle est cocher.Pourtant les valeurs dans la BDD changent lorsque que je la coche mais reviens a l'ancienne dès que je recharge la page car la case à cocher ne retient pas le choix et se décoche systematiquement. Mon script est le suivant :

php:
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
$req2 = $bdd->prepare("UPDATE users SET verified='0' WHERE id= ?");
 
if (isset($_POST['verified'])) {
    $req->execute(array($_SESSION['id']));
    $check = 'checked="checked"';
}
else
{
    $req2->execute(array($_SESSION['id']));
    $check = '';
}
html :

<form method="POST" action="" class="ui form">
         <div class="inline field">
            <div class="ui toggle checkbox">
               <input type="checkbox" tabindex="0" name="verified" class="hidden" <?php echo $check; ?> >
               <label>Badge vérifié</label>
             </div>
             <script type="text/javascript">
                $('.ui.checkbox')
           .checkbox()
         ;
             </script>
         </div>
         <button class="ui button" type="submit">Valider</button>
      </form>
Et donc a chaque fois que je recharge la page la case se décoche et la valeur revient a 0.
Zbuu

Zbuu Le 23 avril 2017 à 21:46

Salut, 

C'est normal quand tu actualises la page tu ne rentres plus dans ta conditions, tu arrives dans ton else et donc ta variable check vaut null.

 Ton code n'est pas complet si ? Si tu fais une requête par exemple 
$q = $db->prepare("SELECT tes_champs FROM ta_table WHERE ton_champs = :ton_champ");
$q->execute([':ton_champ' => $valeur]);
$data = $q->fetch();
Tu pourras récupéré la valeur de ton champ verified et affiché checked ou non dans ton input 
<input type="checkbox" tabindex="0" name="verified" class="hidden" <?= $data['verified'] == 1 ? 'checked' : null; ?> >
Désolé pour les explications c'est pas mon fort 😄 
quenquen147

quenquen147 Le 23 avril 2017 à 22:03 (Édité le 23 avril 2017 à 22:24)

Voici mon code entier 
<?php
session_start(); 
include('../include/base.php');
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
$req2 = $bdd->prepare("UPDATE users SET verified='0' WHERE id= ?");
if (isset($_SESSION['id'])) 
{
   $requser = $bdd->prepare("SELECT * FROM users WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
   $check = "";
if (isset($_POST['verified'])) {
   $req->execute(array($_SESSION['id']));
   $check = '"checked="checked"';
}
else
{
   $check = '';
   $req2->execute(array($_SESSION['id']));   
}
?>
<!DOCTYPE html>
<html>
<head>
   <title>Confidentialité</title>
   <link rel="stylesheet" type="text/css" href="../assets/semantic/semantic.min.css">
   <link rel="stylesheet" type="text/css" href="../assets/style.css">
   <script
     src="https://code.jquery.com/jquery-3.1.1.min.js"
     integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
     crossorigin="anonymous"></script>
   <script src="../assets/semantic/semantic.min.js"></script>
   <script src="../assets/semantic/components/dropdown.js" type="text/javascript"></script>
   <script src="../assets/semantic/components/dropdown.min.js" type="text/javascript"></script>
   <meta charset="utf-8">
</head>
<body>
<header >
   <div class="ui large menu" style="border-radius: 0px;">
  <a class="item" href="../profil.php?id='<?php $_SESSION['id'];?>">
    Profil
  </a>
  <a class="active item">
    Paramètres
  </a>
  <a class="item" href="../security">
    Sécurité
  </a>
  <div class="right menu">
    </div>
      <div class="item">
        <a href="../logout.php"><div class="ui primary button">Se deconnecter</div></a>
    </div>
  </div>
</div>
</header>
<div class="ui container" id="settings">
<div class="ui equal width grid">
  <div class="column">
     <div class="ui vertical pointing menu">
           <a class="item" href="index.php">
             Mes informations
           </a>
           <a class="item">
             Mes réseaux sociaux
           </a>
           <a class="active item">
             Confidentialité
           </a>
         </div>
  </div>
  <div class="eight wide column">
     <div class="ui segment">
        <h2 class="ui header">
           <i class="eye icon"></i>
           <div class="content">
               Confidentialité
             <div class="sub header">Gerer vos paramètres de confidentialité</div>
           </div>
      <div class="ui divider"></div>
      <center>
      <form method="POST" action="" class="ui form">
         <div class="inline field">
            <div class="ui toggle checkbox">
               <input type="checkbox" tabindex="0" name="verified" class="hidden" <?php echo $check; ?> >
               <label>Badge vérifié</label>
             </div>
             <script type="text/javascript">
                $('.ui.checkbox')
           .checkbox()
         ;
             </script>
         </div>
         <button class="ui button" type="submit">Valider</button>
      </form>
      </center>
     </div>
  </div>
  <div class="column">
     3
  </div>
  </div>
</div>
</body>
</html>
<?php
}
else
{
   header('Location: login.php');
}
?>
Et je sais vraiment pas comment faire :(

Car ce que j'aimerai faire enfaite c'est un script du genre :

Si je coche la checkbox alors le champ verified prendra la valeur 1 dans la bdd et la case restera cocher
et si je décoche, le champ verified de la bdd prendra comme valeur 0 et la checkbox restera non cocher après validation du formulaire.
Zbuu

Zbuu Le 23 avril 2017 à 22:28 (Édité le 23 avril 2017 à 22:38)

Si ton champ fait partit de ta table users alors tu peux modifier ton input comme ça 
<input type="checkbox" tabindex="0" name="verified" class="hidden" <?= $user['verified'] == 1 ? 'checked' : null; ?>>


Ensuite pourquoi tu fais :
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
$req2 = $bdd->prepare("UPDATE users SET verified='0' WHERE id= ?");
Alors que tu peux mettre le champ par défaut à 0 et faire l'update à 1 lorsque ton formulaire est envoyé ? 
quenquen147

quenquen147 Le 24 avril 2017 à 17:14

La case reste cocher mais du coup après on peut pas la décocher :(
<?php
session_start(); 
include('../include/base.php');
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
if (isset($_SESSION['id'])) 
{
   $requser = $bdd->prepare("SELECT * FROM users WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
   $check = "";
if (isset($_POST['verified'])) {
   $req->execute(array($_SESSION['id']));
   $check = '"checked="checked"';
}
?>
<!DOCTYPE html>
<html>
<head>
   <title>Confidentialité</title>
   <link rel="stylesheet" type="text/css" href="../assets/semantic/semantic.min.css">
   <link rel="stylesheet" type="text/css" href="../assets/style.css">
   <script
     src="https://code.jquery.com/jquery-3.1.1.min.js"
     integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
     crossorigin="anonymous"></script>
   <script src="../assets/semantic/semantic.min.js"></script>
   <script src="../assets/semantic/components/dropdown.js" type="text/javascript"></script>
   <script src="../assets/semantic/components/dropdown.min.js" type="text/javascript"></script>
   <meta charset="utf-8">
</head>
<body>
<header >
   <div class="ui large menu" style="border-radius: 0px;">
  <a class="item" href="../profil.php?id='<?php $_SESSION['id'];?>">
    Profil
  </a>
  <a class="active item">
    Paramètres
  </a>
  <a class="item" href="../security">
    Sécurité
  </a>
  <div class="right menu">
    </div>
      <div class="item">
        <a href="../logout.php"><div class="ui primary button">Se deconnecter</div></a>
    </div>
  </div>
</div>
</header>
<div class="ui container" id="settings">
<div class="ui equal width grid">
  <div class="column">
     <div class="ui vertical pointing menu">
           <a class="item" href="index.php">
             Mes informations
           </a>
           <a class="item">
             Mes réseaux sociaux
           </a>
           <a class="active item">
             Confidentialité
           </a>
         </div>
  </div>
  <div class="eight wide column">
     <div class="ui segment">
        <h2 class="ui header">
           <i class="eye icon"></i>
           <div class="content">
               Confidentialité
             <div class="sub header">Gerer vos paramètres de confidentialité</div>
           </div>
      <div class="ui divider"></div>
      <center>
      <form method="POST" action="" class="ui form">
         <div class="inline field">
            <div class="ui toggle checkbox">
               <input type="checkbox" tabindex="0" name="verified" class="hidden" <?= $user['verified'] == 1 ? 'checked' : null; ?> >
               <label>Badge vérifié</label>
             </div>
             <script type="text/javascript">
                $('.ui.checkbox')
           .checkbox()
         ;
             </script>
         </div>
         <button class="ui button" type="submit">Valider</button>
      </form>
      </center>
     </div>
  </div>
  <div class="column">
     3
  </div>
  </div>
</div>
</body>
</html>
<?php
}
else
{
   header('Location: login.php');
}
?>
Zbuu

Zbuu Le 24 avril 2017 à 19:24 (Édité le 24 avril 2017 à 19:27)

La case reste cocher mais du coup après on peut pas la décocher :( 
Tu veux dire que ton champ verified reste sur 1 dans ta base de donnée même lorsque tu décoche la checkbox ? C'est normal puisque ta condition gère qu'un seul cas. Tu dois donc géré le cas inverse (je suis actuellement sur mon tel et j'ai des problème avec l'editeur :s) 
quenquen147

quenquen147 Le 24 avril 2017 à 19:40

Est-ce que sa serai possible que tu me donnes la bonne condition à mettre si possible car là je galère vraiment après plusieurs essais 😠
Balatharas

Balatharas Le 24 avril 2017 à 20:37

Bah nan justement il va pas te donner la bonne condition, le but est de te dire quelle condition faut-il faire mais que ce soit toi qui la rédiges. C'est comme ça qu'on apprends 😉
Zbuu

Zbuu Le 25 avril 2017 à 02:48

Ta condition doit faire en sorte que lorsque ton formulaire est envoyé.

Si ta case est coché alors tu update ton champ verified à 1 (ça tu la déjà fais) 
Sinon elle n'est pas coché alors tu update ton champ à 0

Après tu peux faire d'autre vérification du style que si tu renvoie le formulaire avec la case coché alors que ton champ et déjà égale à 1 alors ne rien faire comme ça tu ne fais pas de requête pour mettre ton champ a 1 alors qu'il y est déjà et vice versa. 

@Beignet est-ce que mon message est assez clair ? Si ce n'est pas le cas tu peux mieux lui expliquer ?  
quenquen147

quenquen147 Le 25 avril 2017 à 18:30

C'est déjà ce que j'ai fait mais des que je recharge plusieurs fois la page la case se décoche. 
<?php
session_start(); 
include('../include/base.php');
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
$req2 = $bdd->prepare("UPDATE users SET verified='0' WHERE id= ?");
if (isset($_SESSION['id'])) 
{
   $requser = $bdd->prepare("SELECT * FROM users WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
   $check = "";
if (isset($_POST['verified'])) {
   $req->execute(array($_SESSION['id']));
}
else
{
   $req2->execute(array($_SESSION['id']));
}
?>


quenquen147

quenquen147 Le 25 avril 2017 à 18:38 (Édité le 25 avril 2017 à 18:41)

Finalement j'ai trouvé la technique pour enregistrer la valeur de la case mais elle ne s'enregistre pas dès le moment ou je clique sur le bouton valider, je suis obliger de recharger la page a chaque modification après avoir cliquer sur le bouton valider.

<?php
session_start(); 
include('../include/base.php');
$req = $bdd->prepare("UPDATE users SET verified='1' WHERE id= ?");
$req2 = $bdd->prepare("UPDATE users SET verified='0' WHERE id= ?");
if (isset($_SESSION['id'])) 
{
   $requser = $bdd->prepare("SELECT * FROM users WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
   $check = "";
if (isset($_POST['submit'])) {
if (isset($_POST['verified'])) {
   $req->execute(array($_SESSION['id']));
}
   else
   {
      $req2->execute(array($_SESSION['id']));
   }
}
?>
EDIT :

Enfaite les valeurs de la case a cocher se modifie a chaque fois que je clique plusieurs fois sur le bouton valider.
Zbuu

Zbuu Le 25 avril 2017 à 20:51

Enfaite les valeurs de la case a cocher se modifie a chaque fois que je clique plusieurs fois sur le bouton valider.
En redirigeant vers la même page ça devrait régler ton soucis ? 

if (isset($_SESSION['id'])) {
   $requser = $bdd->prepare("SELECT * FROM users WHERE id = ?");
   $requser->execute(array($_SESSION['id']));
   $user = $requser->fetch();
   // Si le formulaire est envoyé
   if (isset($_POST['submit'])) {
      $req = $bdd->prepare("UPDATE users SET verified = ? WHERE id = ?");
      // Si la checkbox est coché et que le champ verified est différent de 1
      if (!empty($_POST['verified']) && $user['verified'] != 1) {
         // Alors on passe le champ à 1
         $req->execute(array(1, $_SESSION['id']));
      } else {
         // Sinon on passe le champ à 0
         $req->execute(array(0, $_SESSION['id']));
      }
      // Redirection 
      header("Location: ta-page.php");
      exit();
   }
}
(Attention code non testé et écris depuis mon téléphone)
quenquen147

quenquen147 Le 25 avril 2017 à 21:54

Super ça fonctionne bien maintenant et je comprend mieux avec les commentaires pourquoi il y avait des erreurs avant :D !!!  Merci beaucoup pour toute votre aide 😀 ! Je cloture donc ce topic.
Mask

Mask Le 13 février 2021 à 08:33

Bonjour, j'aurais une question concernat le même sujet et je suis pas très doué en codage...

J'aimerais intégrer une checkbox qui reste cochée lorsqu'un utilisateur la cochée, même si il quitte le site et qu'il revient 2 jours après et je n'y arrive pas.

Pour le contexte : c'est un espace membre dans lequel il y a des dizaines de vidéos par page, et j'aimerai simplement afficher une case à cocher "Vidéo lue" pour que les utilisateurs sachent quelles vidéos ils ont visionné. (sachant qu'elles ne sont pas forcément regardé dasn l'ordre de la page, c'est pour quoi j'aimerai mettre cette fonction)

Voilà je sais pas si c'est faisable...

Merci beaucoup

Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte