Partage
  • Partager sur Facebook
  • Partager sur Twitter

Checkbox PHP Mysql problème

    12 mai 2019 à 11:09:41

    Bonjour, bonsoir

    J'aimerais créer un formulaire contenant des checkbox pour ensuite insérer les valeurs retenues dans ma base de donnée, mais je n'y arrive pas, seul les menus déroulant fonctionnent chez moi. Voici mon code :

      <tbody style="background-size: contain; background-repeat: no-repeat; background-orientation: 90deg;"id="table">
                <tr>
                   
                   
                <th scope="col" style="text-align:center;">A</th>
                 <td style="text-align:center">
                     <input type="checkbox" id="checkbox-id" name= "chk1[]" value="0"/> <label for="checkbox-id"></label>
                  
                 </td>
                <td style="text-align:center">
                     <input type="checkbox" id="checkbox-id" name= "chk1[]" value="1"/> <label for="checkbox-id"></label>
                  
                 </td>
               <td style="text-align:center">
                     <input type="checkbox" id="checkbox-id" name= "chk1[]" value="2"/> <label for="checkbox-id"></label>
                  
                 </td>

     <form method="POST">
               <button type="submit" name="submit" >Submit</button>

    Ce sont les checkbox que j'insère (il y en a 30)

    Et voilà le code PHP :

    <?php
    if(isset($_POST['submit']))
    {
        try{

    $pdoConnect = new PDO(''); //Je ne préfère pas dévoiler ma base de donnée
      } catch (PDOException $exc) {
            echo $exc->getMessage();
            exit();
        }



    $req=$bdd->prepare("INSERT INTO produit (schema) VALUES (:0, :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, :26, :27, :28, :29)");
    $conn->beginTransaction();
    $req->execute(array(


    '0' => $_POST['0'],
    '1' => $_POST['1'],
    '2' => $_POST['2'],
    '3' => $_POST['3'],
    '4' => $_POST['4'],
    '5' => $_POST['5'],
    '6' => $_POST['6'],
    '7' => $_POST['7'],
    '8' => $_POST['8'],
    '9' => $_POST['9'],
    '10' => $_POST['10'],
    '11' => $_POST['11'],
    '12' => $_POST['12'],
    '13' => $_POST['13'],
    '14' => $_POST['14'],
    '15' => $_POST['15'],
    '16' => $_POST['16'],
    '17' => $_POST['17'],
    '18' => $_POST['18'],
    '19' => $_POST['19'],
    '20' => $_POST['20'],
    '21' => $_POST['21'],
    '22' => $_POST['22'],
    '23' => $_POST['23'],
    '24' => $_POST['24'],
    '25' => $_POST['25'],
    '26' => $_POST['26'],
    '27' => $_POST['27'],
    '28' => $_POST['28'],
    '29' => $_POST['29'],


    ));

    }
    $conn->null;
    ?>

    avec ce code j'ai cette erreur :  Call to a member function prepare() on null in

    Autre question, peut-on insérer plusieurs donnée dans une seule colonne ? Avec la fonction CONCAT par exemple ?

    Je vous remercie

    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2019 à 11:21:38

      Comment tu peux avoir 1 case à donner et en fournir 30 ?

      Soit tu fait plusieurs VALUES : 'VALUES (1), (2), (3), ...'

      Soit tu bindParam et tu boucle pour execute une requête d'insert :

      $req = $db->prepare('INSERT INTO produit (schema) VALUES(:sc)');
      
      $val = null;
      $req->bindParam(':sc', $val, PDO::PARAM_STR);
      
      for ($i = 0; $i < 30; $i++) {
          $val = $_POST[$i] ?? null;
          $req->execute();
      }


      Mais un formulaire avec en name que des numéros c'est bizarre et je pense qu'il y a un truc à revoir.

      Exemple utiliser dans le formulaire, dans l'attribut name un tableau :

      <input name="schema[]" ...>


      Et on a plus qu'a parcourir avec un foreach.

      • Partager sur Facebook
      • Partager sur Twitter
        12 mai 2019 à 11:43:01

        Bonjour et merci de m'avoir répondu.

        En fait je voudrais réaliser une sorte de quadrillage avec des case à cocher (comme une sorte de bataille navale), avec une valeur par case (ici 5*6 donc 30), je ne sais pas si je m'y prend bien avec des checkbox.

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          12 mai 2019 à 11:44:29

          > $pdoConnect = new PDO

          > $bdd->prepare

          Forcément si la variable pour la connexion change entre les 2, tu ne peux qu'obtenir :

          > Call to a member function prepare() on null

          Le code est faux : tu utilises $_POST['0'] et compagnie quand tu devrais "itérer" sur $_POST['chk1'].

          > Avec la fonction CONCAT par exemple ?

          implode mais tu ne devrais pas le faire pour introduire une (voire deux suivant le type de relation) nouvelle table.

          -
          Edité par julp 12 mai 2019 à 11:49:07

          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2019 à 11:46:09

            +1 julp aussi (vu que on peut toujours pas le faire sur certains sujet)

            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2019 à 12:03:34

              Je pense alors que mon code est à revoir. J'ai corrigé l'erreur prepare() et maintenant j'ai cette erreur Fatal error: Call to a member function beginTransaction() on null in. Pour attribuer chaque valeur je devrai faire donc ceci : '0' => $_POST['chk0'], '1' => $_POST['chk1'], etc ?
              • Partager sur Facebook
              • Partager sur Twitter
                12 mai 2019 à 15:54:27

                Bonjour.

                Pour attribuer chaque valeur je devrai faire donc ceci : '0' => $_POST['chk0'], '1' => $_POST['chk1'], etc ?

                Non, comme te l'a dit julp, c'est sur l'index chk, pour simplifier tu te retrouve avec un tableau de ce genre:

                $_POST['chk'][0]
                $_POST['chk'][1]
                $_POST['chk'][2]
                // etc ...


                Par contre, ta balise form devrait englober tous tes éléments de formulaire, et non juste le button submit.

                • Partager sur Facebook
                • Partager sur Twitter

                Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                  12 mai 2019 à 16:06:00

                  Bon j'ai repris mon code avec quelque chose d'épuré pour y arriver petit à petit :

                  <html>
                      <body>
                          <form method="post">
                              Cases
                             
                             
                               <td style="text-align:center">
                                   <input type="checkbox" id="checkbox-id" name= "a[]" value="1" /> <label for="checkbox-id"></label>
                                
                               </td>
                              
                                 <td style="text-align:center">
                                   <input type="checkbox" id="checkbox-id" name= "a[]" value="2" /> <label for="checkbox-id"></label>
                                
                               </td>
                             
                               <button type="submit" name="submit" value="Save">Submit</button>
                             
                          </form>
                      </body>
                  </html>

                  <?php

                  if($_POST["submit"]=="Save")
                  {
                     
                      $a1 = $_POST['a1'];
                      $a2 = $_POST['a2'];
                     
                    if($a1=="on") $a1=1; else $a1=0;
                    if($a2=="on") $a2=1; else $a2=0;

                      $bdd = new PDO('');
                     
                      $insertmbr = $bdd->prepare("INSERT INTO produit(schema, schema2) VALUES(:a1, :a2)");
                      $insertmbr->execute(array($a1, $a2));

                  }

                  ?>




                   J'ai ici deux checkbox avec un bouton submit pour insérer les valeurs 0 ou 1 dans la bdd, mais j'ai une erreur

                  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in ligne 37 (faute orthographe je présume ? mais je ne la trouve pas)

                  merci

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mai 2019 à 16:10:26

                    Ta requête a 2 marqueurs nommés mais tu les bindes sans nom/comme s'ils étaient positionnels.

                    Et ni $_POST['a1'] ni $_POST['a2'] n'existe, c'est $_POST['a'] tout court (tu auras un tableau - ou rien si rien n'est coché) => fais un var_dump de $_POST.

                    (sans compter qu'ils ne vaudraient pas 'on' mais '1' et '2')

                    -
                    Edité par julp 12 mai 2019 à 16:12:04

                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mai 2019 à 16:24:20

                      <html>
                          <body>
                              <form method="post">
                                  Cases
                                  
                                  
                                   <td style="text-align:center">
                                       <input type="checkbox" id="checkbox-id" name= "a1" value="1" /> <label for="checkbox-id"></label>
                                     
                                   </td>
                                   
                                     <td style="text-align:center">
                                       <input type="checkbox" id="checkbox-id" name= "a2" value="1" /> <label for="checkbox-id"></label>
                                     
                                   </td>
                                  
                                   <button type="submit" name="submit" value="Save">Submit</button>
                                  
                              </form>
                          </body>
                      </html>

                      <?php

                      if($_POST["submit"]=="Save")
                      {
                          
                          $a1 = $_POST['a1'];
                          $a2 = $_POST['a2'];


                      var_dump($_POST);

                          
                        if($a1=="on") $a1=1; else $a1=0;
                        if($a2=="on") $a2=1; else $a2=0;

                          $bdd = new PDO('');
                          
                          $insertmbr = $bdd->prepare("INSERT INTO produit(schema, schema2) VALUES(:a1, :a2)");
                          $insertmbr->execute(array($a1, $a2));

                      }

                      ?>


                      Le var_dump est-il correctement placé ? ça me donne array(2) { ["l2"]=> string(1) "1" ["submit"]=> string(4) "Save" }

                      sinon pour l'erreur je n'ai pas compris ton message

                      merci

                       

                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mai 2019 à 16:30:30

                        > sinon pour l'erreur je n'ai pas compris ton message

                        $insertmbr->execute(array('a1' => $a1, 'a2' => $a2));

                        > ça me donne array(2) { ["l2"]=> string(1) "1" ["submit"]=> string(4) "Save" }

                        l2 sort d'où ? Ca devrait être a2, non ?

                        > if($_POST["submit"]=="Save")

                        incorrect, tu devrais avoir une notice undefined index submit quand tu arrives sur ton formulaire. Il faut utiliser if (isset($_POST['submit'])) voire si t'y tiens : if (isset($_POST['submit']) &amp;&amp; $_POST['submit'] == 'Save')

                        > if($a1=="on") $a1=1; else $a1=0;

                        D'où tu sors 'on' ? Si tu donnes '1' en value, ça ne peut pas valoir 'on' ...

                        Et puis tu peux utiliser (dois) isset si tu veux connaître l'état de ta checkbox (avec éventuellement une cast booléen => entier). Là tu devrais te taper une notice undefined index a1 quand elle n'est pas cochée.

                        $a1 = (int) isset($_POST['a1']);

                        Tu devrais reprendre un cours sur les formulaires.

                        -
                        Edité par julp 12 mai 2019 à 16:36:25

                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mai 2019 à 16:31:48

                          Non, tu es sur que tu as lu ce que t'a dit julp ?

                          Ta requête a 2 marqueurs nommés mais tu les bindes sans nom/comme s'ils étaient positionnels.

                          Soit par exemple :

                          $insertmbr->execute(array('a1' => $a1, 'a2' => $a2));



                          • Partager sur Facebook
                          • Partager sur Twitter

                          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                            12 mai 2019 à 16:34:17

                            ah super merci en effet cela résout le problème, en revanche il n'y a rien dans la base de donnée après exécution du submit, j'ai l'impression que cela provient de ma commande INSERT INTO, ne peut-on pas voir d'où cela provient ? merci
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 mai 2019 à 16:38:53

                              Activer les erreurs PDO/SQL

                              EDIT : mais c'est déjà fait sinon tu n'aurais pas eu la précédente HY093 ? Dans ce cas, s'il n'y a vraiment pas eu d'insertion, c'est que le test if($_POST["submit"]=="Save") est faux ? (name et/ou value changé)

                              -
                              Edité par julp 12 mai 2019 à 16:47:48

                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 mai 2019 à 16:56:42

                                Pour information, la méthode execute renvoi un boolean, soit true ou false, tu pourrais donc par exemple vérifier le retour de la méthode pour savoir si l'insertion s'est bien effectuée ou non.

                                Exemple :

                                if(!$insertmbr->execute(array('a1' => $a1, 'a2' => $a2))) {
                                	// L'insertion ne s'est pas effectuée, afficher un message d'erreur ou autre 
                                }
                                
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                                  12 mai 2019 à 17:01:44

                                  En fait je viens de tester une commande INSERT INTO produit (schema) VALUES ('1') pour tester et il me met une erreur #1064, peut-être que cela vient de là ?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    12 mai 2019 à 17:04:02

                                    Donnes nous le message complet de l'erreur.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                                      12 mai 2019 à 17:06:28

                                      Bonjour,

                                      Merci d'utiliser la balise code Image

                                      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Image de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.

                                      Mauvais titre

                                      Le titre est un élément important qui ne doit pas être négligé. N'oubliez pas cette règle simple : le titre idéal résume la question que vous allez poser en une petite phrase. Il doit permettre aux visiteurs de se repérer facilement dans le forum visité et d'identifier le sujet à sa seule lecture.

                                      Vous pouvez utiliser divers préfixes comme [Erreur], [MySQL], [Compatibilité], etc... Aussi, pensez à consulter les règles propres à chaque forum (visibles dans les topics épinglés en haut des sections).

                                      De plus, choisir un bon titre permet de rendre plus faciles les recherches des autres membres.

                                      Les titres de type "besoin d'aide" ou "problème" ne sont pas tolérés.

                                      Pour modifier votre titre, éditez le premier message de votre sujet.

                                      (titre originel : Checkbox PHP Mysql problème)

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Pas d'aide concernant le code par MP, le forum est là pour ça :)

                                        12 mai 2019 à 17:22:02

                                        Bonjour Lamecarlate je m'excuse concernant la mise en forme de ce sujet, je n'avais pas connaissance de la balise code. En revanche où dois-je aller pour editer mon titre ?

                                        Sinon l'erreur complète est #1064 - erreur de synthaxe près de 'schema) VALUES ('1') à la ligne 1

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          12 mai 2019 à 17:42:43

                                          schema est un mot-clé réservé, il serait préférable de renommer ta colonne sinon tu dois écrire `schema` à chaque fois (et le jour où tu oublies les backticks, rebelote, erreur)

                                          -
                                          Edité par julp 12 mai 2019 à 17:44:44

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            12 mai 2019 à 17:56:28

                                            > Pour modifier votre titre, éditez le premier message de votre sujet.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Pas d'aide concernant le code par MP, le forum est là pour ça :)

                                              12 mai 2019 à 18:01:44

                                              @Lamecarlate : s'il est comme nous, le lien pour éditer ses posts sur ce sujet ne sont pas affichés (ils sont en display: none, il faut s'amuser à inspecter l'élément pour le désactiver)

                                              -
                                              Edité par julp 12 mai 2019 à 18:02:23

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                12 mai 2019 à 18:22:44

                                                C'est bon effectivement schema posait problème, la commande fonctionne maintenant. En revanche lorsque que j'appuie sur le bouton submit il n'y a rien qui s'affiche dans ma base de donnée.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 mai 2019 à 18:26:37

                                                      &lt;form action="" method="POST"&gt;
                                                          Cases 
                                                          
                                                          
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="1" /&gt; 1 &lt;label for="checkbox-id" /&gt;
                                                           
                                                             
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="2" /&gt; 2 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="3" /&gt; 3 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="4" /&gt; 4 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="5" /&gt; 5 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="6" /&gt; 6 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="7" /&gt; 7 &lt;label for="checkbox-id" /&gt;
                                                           
                                                           
                                                               &lt;input type="checkbox" id="checkbox-id" name="a[]" value="8" /&gt; 8 &lt;label for="checkbox-id" /&gt;
                                                           
                                                          
                                                           &lt;button type="submit" name="submit"&gt;Submit&lt;/button&gt;
                                                          
                                                      &lt;/form&gt;
                                                  
                                                  
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    14 mai 2019 à 19:28:19

                                                    Et ?

                                                    Déjà, si tu changes sans cesse les name de tes checkbox, on ne va jamais s'y retrouver.

                                                    Ensuite, quel est le code PHP de traitement ? Quelles sont ta(tes) table(s) ? Que représentent tes checkbox ? (vu que leurs valeurs sont hardcodées)

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      18 mai 2019 à 14:43:23

                                                      Bonjour, je vous pris de m'excuser j'ai eu du mal à poster un message. Finalement j'ai bien réussi à rentrer chaque valeurs dans ma table sql (donc si je coche les checkbox 1, 5 et 18 dans ma table 'quadrillage' va s'afficher 1,5,18) en revoyant mon code. Mais j'aimerais savoir maintenant si il est possible de compter ces nombres : par exemple, si je coche 1, 5 et 18 est-il possible d'insérer dans une table 'Nombre_de_case_cochée' le nombre 3 ici par exemple ?

                                                      Merci infiniment

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        18 mai 2019 à 16:13:54

                                                        Comme on te l'a dit, le truc c'est que ce n'est pas "malin" de mettre plusieurs valeurs dans une même colonne : ça oblige jusqu'à aller faire des traitements en PHP quand on pouvait les faire directement en SQL (et plus tu as de lignes, plus un traitement en PHP va être coûteux). C'est bien pour ça qu'il t'avait été recommandé d'introduire une (à deux suivant la relation) table(s).

                                                        Il te faut faire un count(explode(',', ...))/count($_POST['a']) ?

                                                        -
                                                        Edité par julp 18 mai 2019 à 16:16:08

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 mai 2019 à 12:58:09

                                                          Bonjour,

                                                          malheureusement dans mon cahier des charge je suis obligé de garder chaque valeur des cases et le nombre de case cochées.

                                                          Voici mon code php :

                                                          <?php try{ $bdd = new PDO('');

                                                          } catch (PDOException $exc) {
                                                              echo $exc-&gt;getMessage();
                                                              exit();
                                                          }
                                                          

                                                          if(isset($_POST['submit'])){ {

                                                          $case=implode(',', $_POST['a']);
                                                          
                                                          $insertmbr = $bdd-&gt;prepare("UPDATE produit SET quadrillage='$case' WHERE Date BETWEEN (NOW() - INTERVAL 5 MINUTE) AND NOW()"); 
                                                          $insertmbr-&gt;execute(array($case));
                                                          
                                                          
                                                          echo "<div style="text-align:center;"><a href="%5C">Suivant</a></div>";
                                                          

                                                          } } ?>

                                                          Dois-je rouvrir une parenthèse php pour le count ou puis-je l'ajouter ici ?

                                                          Cordialement merci

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            19 mai 2019 à 13:12:58

                                                            Bonjour.

                                                            Tu devrais revoir comment fonctionnent les requêtes préparées, car là tu fais n'importe quoi.

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter

                                                            Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

                                                              19 mai 2019 à 14:24:44

                                                              Je vous remercie julp j'ai bien réussi à compter mes checkbox.

                                                              Je vous remercie tous infiniment, je sais bien que mon code est assez anarchique pour l'instant mais je travail comme ça.

                                                              Cordialement.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Checkbox PHP Mysql problème

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown