Partage
  • Partager sur Facebook
  • Partager sur Twitter

ajouter donner dans bdd en boucle

Sujet résolu
    18 mars 2019 à 13:45:08

    Bonjour à tous,

    Je ne sais pas si le sujet a déjà été aborder sur ce forum, mais a vrai dire je n'arrive pas moi meme a exprimer ma recherche. J'espère que vous comprendrez mon problème.

    Voilà je suis en train de créer un page pour gérer des inventaires.

    Mon formulaire d'inventaire est généré a partir d'une table : 

    <?php
                  $reqinfoinventaire = $bdd -> prepare('SELECT * from produits where id_inventaire=:id_inventaire AND id_etablissement = :id');
            $reqinfoinventaire->execute(array('id_inventaire'=>$_GET['id_inventaire'], 'id' => $_SESSION['id_etablissement']));
    while ($resultinfoinventaire = $reqinfoinventaire->fetch())
    {
      echo '<tr>
              <td><input type="hidden" name="idproduit" value="'.$resultinfoinventaire['id_produit'].'"/>
              <td><label for="nomproduit">'.$resultinfoinventaire['nomproduit'].' : </label></td>
              <td><input type="number" value="0" name="nomproduit" id="nomproduit"/></td>
              <td ></td>
            </tr>';
    
    }
    ?>

    jusque la tous fonction impecable.

    Je souhaite récupérer chaque valeur de mes inputs "nomproduit" en cliquant sur mon submit "save" et les ajouters a ma bdd ou si le produit existe faite un update.

    Problème c'est que mon code récupérant mes valeur étant un while, je ne récupère que la dernière valeur.

    Comme puis-je récupérer toute les valoir pour les mettre dans des enregistrements de ma bdd.

    Voilà mon code PHP.

    if(isset($_POST['save']))
    { 
    $stockcompte = $_POST['nomproduit'];
    
    $reqaddinventaire = $bdd->prepare("SELECT * FROM produits WHERE id_etablissement=:id_etablissement AND id_produit = :id_produit");
    $reqaddinventaire->execute(array('id_etablissement'=>$_SESSION['id_etablissement'], 'id_produit' => $id_produit));
    $compteproduit = $reqaddinventaire->rowCount();
    while ($resultaddinventaire = $reqaddinventaire->fetch())
    {
      $id_inventaire = $resultaddinventaire['id_inventaire'];
    }
    
    
     
    $reqaddinventaire = $bdd->prepare("SELECT * FROM tempinventaire WHERE id_etablissement=:id_etablissement AND id_produit = :id_produit");
    $reqaddinventaire->execute(array('id_etablissement'=>$_SESSION['id_etablissement'], 'id_produit' => $id_produit));
    $compteinventaire = $reqaddinventaire->rowCount();
    if ($compteinventaire == '0') 
    {
      $insertresa = $bdd->prepare("INSERT INTO `tempinventaire`(
        `id_produit`,
        `id_inventaire`,
        `id_etablissement`,  
        `stockcompte`) 
        VALUES (?,?,?,?)");
        $insertresa->execute(array(
            $id_produit,
            $id_inventaire,
            $_SESSION['id_etablissement'],
            $stockcompte));
    }
    else
    {
    $updateinventaire = $bdd->prepare('UPDATE tempinventaire SET 
    id_produit=:id_produit,
    id_inventaire=:id_inventaire,
    id_etablissement=:id_etablissement,
    stockcompte=:stockcompte WHERE 
    `id_produit` = :id_produit AND 
    `id_etablissement` = :id_etablissement' );
          
    $updateinventaire->execute(array(
    'id_produit' => $id_produit,
    'id_inventaire' => $id_inventaire,
    'id_etablissement' => $_SESSION['id_etablissement'],
    'stockcompte' => $stockcompte,
    'id_produit' => $id_produit,
    'id_etablissement' => $_SESSION['id_etablissement']));
    }
    }
    Merci a tous.



    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2019 à 14:06:02

      Forcément tu écrases ta variable ($id_inventaire) à chaque itération. Pourquoi n'utilises-tu pas fetchAll déjà ?

      Pas sûr de tout comprendre :

      • d'où sort $id_produit et pourquoi tu ne reprends que id_inventaire au lieu de ceux des produits ?
      • pourquoi name="nomproduit" au lieu de name="idproduit[&lt;?= $resultinfoinventaire['idproduit'] ?&gt;]" et n'exploites aucune information dudit formulaire (au lieu de refaire un SELECT) ?

      Il y a éventuellement moyen d'optimiser suivant les clés primaires et uniques en remplaçant les SELECT puis INSERT ou UPDATE par un INSERT ... ON DUPLICATE KEY UPDATE.

      Ton traitement (requête SELECT puis INSERT sinon UPDATE) n'étant pas dans une boucle, tu ne traites qu'un produit à la fois.

      > jusque la tous fonction impecable

      J'en doute parce qu'en l'état (cf second point ci-dessus), tu n'as que la valeur du dernier champ où name="nomproduit".


      Changer le name du form.

      Tu remplaces ton (premier) SELECT par :

      foreach ($_POST['idproduit'] as $id_produit =&gt; $quantite) {
          // mettre ici le restant de ton code
      }
      

      Améliorations :

      • virer cet immonde SELECT * pour ensuite faire un rowCount par un SELECT COUNT(*)
      • déplacer les prepare avant le foreach
      • et comme évoqué ci-dessus, utiliser INSERT ... ON DUPLICATE KEY UPDATE si possible (id_produit + id_etablissement + id_inventaire - l'ensemble - en PK ou UNIQUE ?)

      -
      Edité par julp 18 mars 2019 à 16:16:19

      • Partager sur Facebook
      • Partager sur Twitter
        18 mars 2019 à 15:19:00

        Merci julp, je test ça tous de suite, je vais regarder un tuto pour le insert .... on duplicate key update.


        Pour information, j'ai des requetes avant qui me donne le $id_produit.


        edit : Excuse moi d'être un boulet mais peux tu m'expliquer ta ligne :

        name="idproduit[&lt;?= $resultinfoinventaire['idproduit'] ?&gt;]"





        -
        Edité par Noncascou 18 mars 2019 à 15:36:38

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2019 à 16:15:39

          Le markdown est buggé depuis bientôt 2 ans, il faut lire > à &lt; et < à &lt;, tu devrais donc reconnaître la balise courte équivalente à echo.

          Sinon le but c'est de générer un champ ayant pour nom idproduit[id_du_produit] de façon, en PHP, à récupérer un tableau ($_POST['idproduit'] - j'aurais peut être du opter pour un pluriel d'ailleurs) où les clés seront l'identifiant du produit et en valeur la quantité associée (faire un var_dump au besoin).

          • Partager sur Facebook
          • Partager sur Twitter
            18 mars 2019 à 18:45:52

            ok pour le $_POST, maintenant c'est le foreach qui déconne :-(
            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2019 à 16:43:39

              excusez ma réponse tardive, j'ai beaucoup de boulot en ce moment.

              Je viens de réussir mon foreach (avec beaucoup de mal) 

              Tout fonction parfaitement SAUF (désolé il y a un sauf) mon champ id_produit, si je le rentre dans mon insert into, rien ne s'enregistre, je l'enlève, mon insert fonction mais du coup je ne peux pas identifier le produit (ce qui pose pas mal de problème xD).

              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2019 à 16:50:46

                Si l'insert ne se fait pas, c'est que ta requête doit planter, par conséquent, si toutes les erreurs (php + pdo) sont activées, tu devrais en avoir la raison, non ?

                tempinventaire.id_produit est bien FK de produits.id_produit ?

                Code ? Structure de la table ?

                Et var_dump($_POST); ? (des fois que $_POST['id_produit'] n'existe même pas au départ)

                -
                Edité par julp 22 mars 2019 à 16:55:29

                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2019 à 18:40:34

                  Aucune erreur affiché.

                  Le lien code structure table est correct j'ai vérifié.

                  résultat du var_dump : 

                  array(6) { [3]=> string(1) "3" ["idproduit"]=> array(4) { [3]=> string(4) "1212" [4]=> string(4) "1313" [10]=> string(4) "1414" [12]=> string(4) "1515" } [4]=> string(1) "4" [10]=> string(2) "10" [12]=> string(2) "12" ["save"]=> string(24) "Enregistrer et vérifier" } 

                  Le problème c'est qu'en faisant 

                  foreach ($_POST['idproduit'] as $id_produit => $quantite) 

                  Je ne sais pas comment récupérer la valeur de mon array, en gros il me faut le 1313 et le 10 le 1313 qui correspond au nombre d'article, et le 10 a l'id de l'article.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2019 à 18:58:23

                    C'est l'article d'id 4 qui a 1313 pour quantité et tu les trouves respectivement en tant que $id_produit et $quantite, non ? Code ?

                    > Aucune erreur affichée.

                    Ce qui m'amène à penser que les erreurs PDO ne sont pas activées justement (mais tu ne nous as jamais montré le code de la "connexion").

                    -
                    Edité par julp 22 mars 2019 à 19:04:26

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2019 à 19:09:10

                      J'ai bien 

                      <input type="number" value="" name="idproduit['.$resultinfoinventaire['id_produit'].']" id="nomproduit"/>

                      la valeur saisi par l'utilisateur est bien prise en compte, le soucis c'est pour l'enregistrement (pour le traitement par la suite) il me faut l'id_produit avec la valeur saisie par l'utilisateur dans le meme enregistrement. Mais comment retrouver cette id en rapport avec la quantité ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 mars 2019 à 19:20:54

                        C'est le foreach qui est censé te le donner justement via $id_produit puisqu'il est en clé du tableau $_POST['idproduit'].

                        Montre voir ton code/foreach.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 mars 2019 à 19:27:22

                          if(isset($_POST['save']))
                          foreach ($_POST['idproduit'] as $quantitesaisie=>$quantite) 
                          {
                              $insertresa = $bdd->prepare("INSERT INTO `tempinventaire`(
                              'id_produit',
                              `id_inventaire`,
                              `id_etablissement`,  
                              `stockcompte`) 
                              VALUES (?,?,?,?)");
                              $insertresa->execute(array(
                                  $quantitesaisie,
                                  $id_inventaire,
                                  $_SESSION['id_etablissement'],
                                  $quantite));
                          }
                          }
                          EDIT :
                          Je viens de voir ma connerie, le 'au lieu du `

                          -
                          Edité par Noncascou 22 mars 2019 à 19:30:17

                          • Partager sur Facebook
                          • Partager sur Twitter

                          ajouter donner dans bdd en boucle

                          × 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