Partage
  • Partager sur Facebook
  • Partager sur Twitter

récupérer les données de mon tableau

Sujet résolu
    4 février 2024 à 17:51:30

    bonjour à toutes et tous,

    je suis débutant en programmation et je viens chercher de l'aide après plusieurs jours de recherches sans résultat.
    petit explication déjà pour bien comprendre mon projet :

    Le but est de créer d'abord un événement que j'enregistre dans une table puis ensuite de choisir une liste d'articles qui serviront pour cet événement.

    j'ai donc une variable que je vais conserver (id_even) à la fois dans ma table qui enregistre mon événement et dans la table qui mémorise mon  panier d'articles afin de garder un lien entre-elles.

    j'ai créer une bdd d'articles divisés en divers catégories et que je fais apparaitre sur une page (toujours la même) en me servant d'un bouton de formulaire qui appelle une requette spécifique pour les lister.
    Donc, en fonction du bouton cliqué, je fais afficher la liste des articles correspondant à cette catégorie.

    listing des articles

    Dans ce listing qui apparait, je veux pouvoir sélectionner certain articles.
    j'ai  donc créer pour chaque ligne d'article une checkbox à cocher et un champ text pour entrer la quantité d'articles souhaité.

    j'ai également un champ hidden pour faire passer aussi l'id_article et l'id_even

    Ce listing est encadré dans un formulaire qui, lorsqu'il est validé, me refait afficher la page.
    En période de test et avant de me lancer dans l'insertion ou l'update du panier, je cherche donc à faire afficher le résultat de ma sélection et m'assurer que tout est ok.

    c'est là que mon problème commence!...

    en fait, si je sélectionne les 3 premiers articles du listing, pas de souci, il me récupére bien les données et me les énumére dans l'ordre.

    je fait afficher l'id_checkbox, val_qt, id_article) :

    en mettant les quantités toujours à 7, j'obtient :

    071
    172
    273

    par contre si je coche une checkbox 2 lignes plus bas (donc je saute une ligne), là je perds  la valeur de la quantité et aussi l'id article ne correspond plus à la ligne choisi. (????)

    071
    172
    273
    34
    475
    576

    pour ce résultat, j'ai sélectionné et renseigné la quantité (7) des lignes 1,2,3,5,6,8

    normalement j'aurai du avoir :

    071
    172
    273
    375
    476
    578

    Je souhaiterai donc comprendre :

    - POURQUOI JE PERD LA VARIABLE "val_qt" LORSQUE JE SAUTE UNE LIGNE et LA RETROUVE PAR CONTRE QUAND JE FAIS SUIVRE DEUX AUTRES LIGNES ENSUITE?

    - POURQUOI MA VARIABLE "id_article" NE S'AFFICHE PAS CORRECTEMENT PUISQUE LA VALEUR NE CORRESPOND PAS A LA LIGNE SÉLECTIONNÉE?

    En remerciant d'avance l'un ou l'une d'entre-vous pour votre aide.

    if(isset($_POST['checkbox'])) {   
    foreach($_POST['checkbox'] as $id_checkbox => $value)
     {
           echo  $id_checkbox;
           echo  $_POST['val_qt'][$id_checkbox];
           echo  $_POST['id_article'][$id_checkbox];
          
           echo "<br>";
    
     }
    
    }


    /// et mon code pour la page d'affichage :

    voici aussi le contenu de la page d'affichage :

    echo "<form action=\"atl_choix_articles.php\" method=\"post\" enctype=\"multipart/form-data\" name=\"req_form\">";
    
    
    
    echo "<table width=\"800\" border=\"0\" cellspacing=\"2\" cellpadding=\"5\" class=\"tab_titre_medium\">";
        
    
    // on AFFICHE l'ensemble des accessoires de la familles DIFFUSION
    $sql_systemdiffusion = "SELECT id_article, id_fam, id_sous_fam, id_categ, id_sous_categ, id_marque, name_article, qt_stock, mouv_stock, url_img, img_article FROM atl_articles WHERE id_fam ='1' AND id_sous_fam ='1' ORDER BY id_sous_fam, id_categ, id_sous_categ";
    $my_Insert_Statement = $my_Db_Connection->prepare ($sql_systemdiffusion); /* On prépare la requête */
    $my_Insert_Statement->execute($params); /* On execute la requete */
    
    while($row = $my_Insert_Statement->fetch(PDO::FETCH_OBJ))
    {
    echo "<tr>";
    echo   "<td align=\"center\" width=\"20\" height=\"50\" bgcolor=\"#cccccc\">";
    echo "<input name=\"id_even\" type=\"hidden\" value=".$_POST['id_even']." />";
    echo "<input name=\"id_fam\" type=\"hidden\" value=".$_POST['id_fam']." />";
    echo "<input name=\"id_sous_fam\" type=\"hidden\" value=".$_POST['id_sous_fam']." />";
    echo '<input name="id_article[]" type="hidden" value="'.$row->id_article.'" />';
    echo '<input type="checkbox" name="checkbox[]" value"1" />'.$row->id_article.'</td>';
    echo   "<td align=\"center\" width=\"50\" height=\"60\" bgcolor=\"#cccccc\"><input name=\"val_qt[]\" type=\"text\" size=\"2\" maxlength=\"2\" value=\"\" /></td>";
    echo   "<td align=\"center\" width=\"50\" height=\"60\" bgcolor=\"#cccccc\">".$row->mouv_stock."</td>";
    echo   "<td width=\"600\" height=\"50\" bgcolor=\"#cccccc\">".$row->name_article."&nbsp;--&nbsp;(".$row->qt_stock.")</td>";
    echo   "<td width=\"60\" height=\"50\" align=\"center\"><img id=\"".$row->id_article."\" src=\"img/".$row->url_img.$row->img_article."\" alt=\"".$row->name_article."\" style=\"width:100%;max-width:50px;height:100%;max-height:50px\">";
    echo "</td>";
    echo   "</tr>";   
        
    }
    
    echo   "</table>";
    
    echo "<br />";
    echo "<input name=\"req_form\" type=\"submit\" value=\"VALIDER\" />";
    echo "</form>";



    -
    Edité par VinceH82 5 février 2024 à 9:07:02

    • Partager sur Facebook
    • Partager sur Twitter
      4 février 2024 à 18:39:20

      Bonjour, Merci de lire les règles du forum AVANT de créer un sujet.

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code </>

      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  </> 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>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        5 février 2024 à 9:08:46

        bonjour AbcAbc6
        désolé j'ai effectivement oublié de lire le mode d'emploi du site.
        je viens de rectifier, en espérant que ça ne pénalisera pas ma demande d'aide.

        cordialement,
        vincent

        • Partager sur Facebook
        • Partager sur Twitter
          5 février 2024 à 23:41:11

          Salut

          Mon conseil pour ceux qui font du PHP : n'utilisez pas echo à tout va pour afficher votre HTML, mais "fermez" PHP (?>), mettez le HTML comme tel, puis rouvrez (<?php) pour la suite, et utilisez le raccourci pour afficher des éléments simples (<?= $leTruc->aAfficher; ?>). Vous aurez une lecture de code un peu meilleure du fait de la coloration sytaxique, et les performances n'en sont pas significativement impactées. Voici ce que cela donnerait ci-dessous — malheureusement, sur ce forum, c'est avec la coloration syntaxique du PHP en moins, seulement je trouve toujours mieux que les longues chaînes unies.


          Afin de "lier les champs d'une même ligne", je propose un petit remaniement des attributs name comme suit :

          <form action="atl_choix_articles.php" method="post" enctype="multipart/form-data" name="req_form">
              <table width="800" border="0" cellspacing="2" cellpadding="5" class="tab_titre_medium">";
          <?php
          // on AFFICHE l'ensemble des accessoires de la familles DIFFUSION
          $sql_systemdiffusion = "SELECT id_article, id_fam, id_sous_fam, id_categ, id_sous_categ, id_marque, name_article, qt_stock, mouv_stock, url_img, img_article FROM atl_articles WHERE id_fam ='1' AND id_sous_fam ='1' ORDER BY id_sous_fam, id_categ, id_sous_categ";
          $my_Insert_Statement = $my_Db_Connection->prepare ($sql_systemdiffusion); /* On prépare la requête */
          $my_Insert_Statement->execute($params); /* On execute la requete */
          
          while($row = $my_Insert_Statement->fetch(PDO::FETCH_OBJ)): ?><tr>
                      <td align="center" width="20" height="50" bgcolor="#cccccc">
                          <input name="diffusions[<?= $row->id_article; ?>][fam]" type="hidden" value="<?= $_POST['id_fam']; ?>" />
                          <input name="diffusions[<?= $row->id_article; ?>][sous_fam]" type="hidden" value="<?= $_POST['id_sous_fam']; ?>" />
                          <input type="checkbox" name="diffusions[<?= $row->id_article; ?>][event]" value="<?= $_POST['id_even']; ?>" /><?= $row->id_article; ?></td>
                      <td align="center" width="50" height="60" bgcolor="#cccccc"><input name="diffusions[<?= $row->id_article; ?>][qte]" type="text" size="2" maxlength="2" value="" inputmode="numeric" /></td>
                      <td align="center" width="50" height="60" bgcolor="#cccccc"><?= $row->mouv_stock; ?></td>
                      <td width="600" height="50" bgcolor="#cccccc"><?= $row->name_article; ?> — (<?= $row->qt_stock; ?>)</td>
                      <td width="60" height="50" align="center"><img id=""<?= $row->id_article; ?>"" src="img/<?= $row->url_img.$row->img_article; ?>" alt="<?= $row->name_article; ?>" style="width:100%;max-width:50px;height:100%;max-height:50px"></td>
                  </tr>  
               
          <?php endwhile; ?>
          
              </table>
              <br />
              <button name="req_form" type="submit">VALIDER</button>
          </form>

          Et une partie du fichier atl_choix_articles-php pourrait être ce qui suit.

          <?php
          /* $_POST['diffusions'] devient un tableau avec pour index
           * l'ID des articles, et là-dedans un index pour les famille,
           * sous-famille, quantité et événement.
           * $_POST['diffusions'] == [
           *     l'ID d'un article => [
           *         'fam'      => l'ID de la famille
           *         'sous_fam' => l'ID de la sous-famille
           *         'qte'      => la quantité saisie (ou une chaîne vide)
           *         'event'    => l'ID de l'événement SEULEMENT SI LA CASE A ETE COCHEE
           *     ],
           *     // Ici, d'autres structures similaires avec les autres ID d'articles
           *     // …
           * ]
           */
          foreach ($_POST['diffusions'] as $idArticle => $diffusion) {
              if (empty($diffusion['event'])) {
                  /* Dans le cas où on n'avait pas coché la case de l'article, on n'a pas
                   * l'ID de l'événement, donc on ne souhaite pas l'article pour ledit
                   * événement. On peut passer à l'article suivant */
                  continue;
              }
          
              /* Comme expliqué ci-avant, on a
               * $diffusion == [
               *     'fam'      => l'ID de la famille
               *     'sous_fam' => l'ID de la sous-famille
               *     'qte'      => la quantité saisie (ou une chaîne vide)
               *     'event'    => l'ID de l'événement, qu'on sait ici renseigné
               * ]
               */
          }
          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2024 à 10:29:22

            bonjour Ymox
            déjà un grand merci pour avoir pris le temps de me solutionner mon problème.
            j'avais suivi une formation en 2003, depuis pas mal de choses ont changé et du coup faut que je me remette un peu à la page!

            Alors déjà pour la façon d'écrire le php avec le html, de toute évidence c'est 100 fois mieux et bien plus lisible et surement moins source d'erreur avec ces doubles cotes et c'est anti-slash qui trainent partout. déjà là, ça fait progresser dans la façon de faire.

            Ton approche sur la façon de voir les choses au niveau des variables a été aussi très instructive, effectivement le fait de prendre id_article comme référence me parait évident, maintenant que tu me l'as montré!

            après je ne pense pas avoir besoin de récupérer la l'ID de la famille et de la sous famille puisque mon panier ne va inclure que ces variables :
            id_panier     id_even     id_article     qt_panier

            je pourrais alors me servir de l'id_article et de l'id_even pour en modifier son contenu par la suite si besoin.

            par contre, l'id_even est important et je m'apperçois qu'il n'est plus là quand je clique sur le bouton "valider" du formulaire.
            car ensuite je vais aller dans d'autres catégories pour choisir d'autres articles et les ajouter au panier et donc avec le même id_even.
            je l'ai donc conserver via un champ de formulaire de type "hidden", c'est correct n'est-ce pas?

            mais donc tout fonctionne très parfaitement et j'arrive maintenant à faire afficher uniquement les résultats des articles sélectionnés, donc c'est super!

            je bloque par contre maintenant sur la façon de créer ma requete (PDO).
            je vais donc creuser un peu le sujet et voir si j'arrive à me débrouiller, sinon je reviens vers toi d'ici ce soir.

            je garde donc le sujet "OUVERT" pour le moment.

            en tous cas encore un grand merci Ymox pour ton aide qui m'a été précieuse.


            -
            Edité par VinceH82 6 février 2024 à 12:22:03

            • Partager sur Facebook
            • Partager sur Twitter

            récupérer les données de mon tableau

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown