Partage
  • Partager sur Facebook
  • Partager sur Twitter

ID non trouvé dans mon tableau

Requete Input Hidden

    20 janvier 2021 à 11:57:43

    Bonjour,

    J'ai un tableau sous cette forme :

    while($row = mysqli_fetch_array($result))
     {
      $output .= '
       <tr>
        <td>'.$row["id_produit"].'</td>
        <td>'.$row["nomProduit"].'</td>
        <td>'.$row["libelleProduit"].'</td>
        <td>'.$row["prixProduit"].'</td>
        <td><input type="hidden" name="id_produit[]" value="<?php echo '.$row['id_produit'].'; ?>" />                       
        <td><input type="number" step="1" value="qte" name="quantite[<?php echo '.$row['id_produit'].'; ?>]" min="0" max="20">
        
       </tr>
       
      ';
     }



    Quand je submit ça j'éxécute le code suivant :

    <?php
    
    $id_produits = !empty($_POST['id_produit']) ? $_POST['id_produit'] : NULL;
    $quantites= !empty($_POST['quantite']) ? $_POST['quantite'] : NULL;
    
    // Requêtes d'ajout d'ouvrages à la commande
    if(isset($_POST['commander'])){
       
    
        if($quantites>0){
            // Création de la commande
            // $commander = mysqli_real_escape_string($con, htmlspecialchars($_POST['commander']));
    
            $commande1="INSERT INTO commande(`id_client`,`etat_commande`)
                        VALUES (1, 'en attente')";
            
            //exécution de la requete
            if(!mysqli_query($con, $commande1) ){
                echo("Erreur dans la requete : " . $commande1 . ' <br>Erreur :' . mysqli_error($con));
            }
       
            // récupération de l'id nouvellement inséré en BDD
            $id_commande =  mysqli_insert_id($con);         
            
            // Puis boucle sur le/les produit(s) pour les ajouter dans la commande
            foreach($quantites as $id_produits => $qte ){
    
                if( !empty( $qte) && !empty($id_produits) ) {
                $commande2="INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`)
                            VALUES ('".$id_commande."', '".$id_produits."', '".$qte."')";
      
                    //exécution de la requete 2 avec le même id_commande.
                    if(!mysqli_query($con, $commande2) ){
                        echo("Erreur dans la requete : " . $commande2 . ' <br>Erreur :' . mysqli_error($con));
                    }
                }
            } 
        }
        if($quantites=0){
            echo"Aucun ouuvrage sélectionné !";
        }    
    }
    
    ?>



    Ca a l'air de fonctionner, mais en réalité ca ne détecte pas l'id produit que j'ai mit en hidden dans le formulaire, en revanche ca insert l'id commande et la quantité.
    L'erreur affichée est la suivante :

    Erreur dans la requete : INSERT INTO commande_contenu(`id_commande`,`id_produit`,`quantite`) VALUES ('104', '', '1')
    Erreur :Incorrect integer value: '' for column 'id_produit' at row 1


    Merci de votre aide, bonne journée !

    -
    Edité par anonov 20 janvier 2021 à 11:59:07

    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2021 à 11:59:50

      Enlève les echo : les <?php echo + ; ?> n'ont rien à faire là, tu es dans une chaîne et fais une concaténation en plus. Regarde la source de ta page.

      Tu as des injections SQL : la requête n'est ni préparée ni n'échappes/castes pour autant et des XSS d'ailleurs.

      Quelle est cette manie d'afficher les erreurs SQL au client ? Ou comment faciliter la recherche et exploitation de ces injections SQL ... Vous ne pouvez pas mettre un mysqli_report pour tout votre script au lieu d'un mysqli_error sur chaque requête ?

      Tant qu'on y est, faire le tout dans une transaction SQL ?

      Le name="id_produit[]" ne devrait pas être nécessaire, tu l'as en clé de quantite. D'ailleurs tu n'utilise pas $_POST['id_produit'] vu que tu l'écrases justement lors du foreach pour cette clé.

      > if($quantites&gt;0){

      $quantites est un tableau, pas un entier.

      > if($quantites=0){

      Sera toujours faux, tu fais une affectation d'une valeur fausse. (confusion = et == quoi)

      On est pas mal là, j'en ai oublié ?

      -
      Edité par julp 20 janvier 2021 à 12:10:05

      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2021 à 12:38:57

        « J'ai un tableau sous cette forme : »

        Ta forme est inutilement compliquée. je t'ai répondu ici.

        Cordialement
        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2021 à 12:47:25

          Sachant qu'on tente d'éviter de faire utiliser extract() pour des questions de sécurité (cela écrase silencieusement les variables qui seraient déjà existantes), je n'adhère pas à la solution proposée dans l'autre sujet.

          -
          Edité par Ymox 20 janvier 2021 à 12:48:11

          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2021 à 13:31:51

            Peut être pas jusqu'à parler ici de sécurité (à moins vraiment d'avoir une injection SQL en plus au départ), extract n'étant pas appliquée à $_POST mais à la seule ligne lue de la requête donc normalement tu maîtrises un minimum son contenu. Cela dit, je ne recommande pas pour autant, parce que sur un SELECT *, surtout avec des jointures, on ne peut plus vraiment dire que tu maîtrises réellement les variables ainsi créées et tu risques potentiellement d'en écraser une. Même si c'était faux au moment où tu l'écris, si tu modifies par la suite tes tables et/ou requêtes, rien ne garantit que ça n'arrivera pas plus tard. En conséquence, le seul moyen de prévenir tout problème, c'est de bannir purement et simplement l'usage d'extract (surtout sans utiliser de préfixe) qui pose plus de problème qu'il n'en résout. Il pourrait être bon d'ailleurs de plutôt envisager une déstructuration dans ce cas, même si c'est plus long (while(['id_produit' => $id_produit, 'nomProduit' => $nomProduit/*, ... */] = mysqli_fetch_array($result)))

            Bref, de toute façon ici extract est hors sujet, il ne solutionne en rien la question initiale.

            -
            Edité par julp 20 janvier 2021 à 13:41:16

            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2021 à 16:24:07

              « Bref, de toute façon ici extract est hors sujet, il ne solutionne en rien la question initiale. »

              C'est pourquoi ce n'est pas sur ce topic que je me suis exprimé.

              Du reste, mon intervention (sur l'autre topic) tendait à simplifier énormément l'élaboration d'une chaîne de caractère. Je montrais deux méthodes que manifestement l'auteur du sujet ne connait pas, sinon il ne s'em***derait pas comme il le fait. Donc je lui rend service. C'est mal ?

              Enfin, extract prend en second argument un paramètre qui contrôle les risques de collision. Perso, j'utilise couramment EXTR_PREFIX_ALL Je laisse à anonov le soin de se renseigner sur cette fonction.

              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2021 à 16:45:19

                > C'est pourquoi ce n'est pas sur ce topic que je me suis exprimé.

                Tu l'as tout de même remis sur le tapis sur ce sujet. Pour dire, sur le coup, je n'en comprenais pas pourquoi Ymox évoquait extract.

                > C'est mal ?

                Je n'approuve pas spécialement en tout cas et je ne suis visiblement pas le seul (ie tant que celui qui l'utilise le fait en son âme et conscience, ok, pourquoi pas, mais comme tu dis, je doute que ce soit le cas du PO). De toute façon, tu lui avais proposé de simplifier son code par extract de façon à ensuite exploiter l'interpolation des variables, ça j'ai bien compris, sauf que j'y vois un problème : il manque les htmlspecialchars censés être nécessaires par rapport aux XSS, point que j'avais soulevé dans ma réponse initiale. Comme PHP ne permet uniquement l'interpolation de variables et non d'expressions comme dans de nombreux langages (même pas de constantes, lol), un extract perdrait tout intérêt si les htmlspecialchars que l'on devrait trouver étaient ajoutés (ou alors il faut array_map avec htmlspecialchars en callback avant d'extract mais je trouve ça guère élégant et un tantinet bourrin)

                Pour revenir à extract, on est tous sur la même longueur d'onde en fait ? On est tous d'accord pour dire que son usage est globalement à éviter, non ? Ne penses-tu pas qu'il serait préférable autant que possible d'orienter les gens vers de bonnes pratiques ? On voit déjà assez d'horreurs comme ça ...

                -
                Edité par julp 20 janvier 2021 à 17:05:28

                • Partager sur Facebook
                • Partager sur Twitter
                  21 janvier 2021 à 9:08:09

                  Bon merci à vous, j'en apprends beaucoup en vous lisant. Je vais me renseigner sur toutes les idées que vous avez soumise. Merci et bonne journée !

                  • Partager sur Facebook
                  • Partager sur Twitter

                  ID non trouvé dans mon tableau

                  × 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