Boucle sur un formulaire ou il manque un élément. [Résolu]

Signaler
Messages postés
30
Date d'inscription
mercredi 22 août 2007
Statut
Membre
Dernière intervention
24 juin 2008
-
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
-
Bonjour tout le monde,
Alors je ne sais  pas trop si c'est le soleil qui me tape trop sur la tete aujourd'hui, mais pas moyen de résoudre un truc qui me semble simple.
Voila, pour un pressing je dois faire une liste de vetements (chemise, pull...). Cette liste est dans ma BDD.
J'affiche donc la liste via une boucle, ainsi qu'une CheckBox et un Input.
Si le client veut un article (chemise par exemple) il coche la checkbox, et tape le nombre d'article dans l'input.
Alors ok pour l'affichage de la liste, ok pour la boucle de la checkbox (il m'affiche bien seulement ceux cochés) mais pas moyen de faire rentrer dans la boucle l'input.
Par exemple le premier vêtement coché (anorak ici) obtiendra bien le nombre voulu, mais pour les autres rien.
Et je précise que c'est seulement le premier de la liste qui marche bien, et non le premier coché (si je coche le deuxième ça ne marche pas).
Donc je dois me gourer quelque part dans ma boucle mais j'ai beau chercher là je sèche, alors si quelqu'un peut m'éclairer...
Sachant qu'un fois cela fait je vais devoir multiplier le prix des vetements par le nombre de ce fameux imput pour faire un sous total, puis à la fin un total complet, mais c'est une autre histoire.
Voici mon code, et merci d'avance...

La boucle qui récupére les données:
<?php
$vet = $_POST['vetement'];
$NBvet = $_POST['NBvetement'];
if (isset($_POST['vetement'])) {
    echo "Vous avez choisi :";
        for ($i 0, $c count($vet); $i < $c; $i++) {
        echo "
"  .$vet[$i]. " ";
        echo " x ";
        echo ""  .$NBvet[$i]. "";
       
    }     
   
}
?>

Et le fomulaire issu de la BDD:

<?php
  while($Pressing = mysql_fetch_array($PressingList))
  {  
  $tab   = $Pressing['vetement_p'];
  $tab2  = $Pressing['tarif_p'];
  $tabid = $Pressing['ID_pressing'];

    echo "<tr >";
    echo "<td > $tab </td>";
    echo "<td  > $tab2 € </td>";
    echo "<td ></td>";
    echo "<td >x </td>";
    echo "</tr>";

    }
    ?>

Lolo

10 réponses

Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Ahhhhhhhhhh !!!

Oui, c'est bon j'ai trouvé ;)
C'était tout bête : tu ne peux pas faire comme ça ...
En fait, tu dois dans ce cas là, soit utiliser ma méthode (avec name_input[$ID][0/1]) soit transformer legerement ton code.

Dans ce dernier cas, tu dois transmettre un ID (un peu comme la 1er méthode)

Regarde le code :

if ( isset($_POST['vetement'], $_POST['NBvetement']) )
{
    $vet = $_POST['vetement'];
    $NBvet = $_POST['NBvetement'];
   
    if( is_array($vet) && is_array($NBvet) )
    {
        $totalart = count($vet);
       
        echo 'Vous avez choisi :';
       
        // foreach est une fonction équivalente à for ou While, mais plus puissante.
        foreach( $vet as $key => $value )
        {
            // Il faut vérifier que l'équivalent ($NBvet[$key]) existe, sinon on passe
            // Ici, $value est la valeur de $_POST['vetement'][$key]
            if( !isset($NBvet[$key]) )
            {
                continue;
            }
            echo '<li>', $value,  ' x ', $NBvet[$key], '';
        }

        echo '
Au total ', $totalart, ' articles sélectionnés';

    }
    else
    {
        echo 'Erreur !';
    }
}

echo '<form action ="?" method="POST">';

while($Pressing = mysql_fetch_array($PressingList))
{  
    $tab   = $Pressing['vetement_p'];
    $tab2  = $Pressing['tarif_p'];
    $tabid = $Pressing['ID_pressing']; // ID_pressing ??? C'est l'équivalent de ID_vetement ... ?

    echo \"----
\";
    echo \"$tab, \";
    echo \"$tab2 €, \";
    echo \"".$tabid."]' type='checkbox' value='".$tab."' />, \";
    echo \"x ".$tabid."]' type='text' size='2' value='' />, \";
    echo \"\";
}

echo '
</form>';
<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
1980
Date d'inscription
dimanche 20 février 2005
Statut
Membre
Dernière intervention
24 septembre 2012
5
Hello,

fait des print_r( ) de tes tableaux et tu verras bien d'où vient l'erreur.

à+
Messages postés
3472
Date d'inscription
lundi 16 juillet 2007
Statut
Membre
Dernière intervention
28 février 2014
32
Evangun ++

Tu peus aussi faire un var_dump des tableau je crois...

a++

Si la réponse vous convient, pensez : Réponse acceptée !
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Hello !

Petes critiques sur ton code ^^
Tu ne sécurises pas tes variables $_POST ! Hyper facile à piraté ... Oh, et tester l'existance d'une variable apres l'avoir demandé, c'est pas bon. Inverse à la rigeur ton $vet = [...]; et ta condition)
Utilise isset(), intval(), htmlentities(), ...
Et evite de mettre une fonction dans ta boucle for (je parle du count(), ici). Crée une variable avant, tu gagneras en temps d'execution.
Tu peux mettre (vivement recomandé) des simple quote ( ' ) à la place des doubles quotes ( " ) dans tes echo ; tout comme une virgule à la place des points (seulement pour echo)

Après, je vois pas vraiment ton problème ... :s Oui, utilise un print_r($_POST); pour voir tes valeurs ...

Sinon, petit code pédagogique ... je ne sais pas si il mùarche, c'est fai à la va vite ^^ (je m'ennuiyais ^_____^) :

<?php

# TRAITEMENT
$produits=array();
$error=null;

// Le formulaire à été envoyé
if(isset($_POST['infos']))
{

        // Les données retournée doivent être sous la forme d'un array

        if(is_array($_POST['infos']))

        {

                // On fait une boucle pour lire les infos

                // Les infos sont evoyées de la forme " infos[$KEY][0] = $VAL ". $key est donc l'id du produit

                foreach($_POST['infos']as$key=>$val)

                {

                        // On force le type numerique pour le nombre de produit

                        $val[1]=intval($val[1]);

                        // On protége le nom du produit et on le "decode()"

                        $val[0]=htmlspecialchars(urldecode($val[0]));

                        

                        // Erreur formulaire : il n'existe pas l'une des informationsd demandées

                        if(!isset($val[0],$val[1]))

                        {

                                $error='Erreur';

                                continue;

                        }

                        

                        // Tout s'est bien déroulé, on enregistre l'information !

                        $produits[]=' '.$val[1].'   * '.$val[0];

                }

        }

        else

        {

                $error ='Erreur formulaire';

        }
}

// On regarde le code retour
// Il n'y à pas d'erreur ;)
if(!$error)
{

        // On liste els produits.

        //
Implode() permet de lister toutes les valeurs de l'Array() en y
insérant une chaine séparatrice. Ici on obtient une jolie liste à puce

        echo'Vous avez choisis : 
',implode('</li></li>',$produits),'';
}
else
{

        echo$error;
}

# FORMULAIRE

while($row=mysql_fetch_assoc($query))
{

        // l'ID du vetement, que l'on encode pour la sécurité et protéger le code

        //
Perso, ici je conseil un ID numeric, c'est plus simple, permet une plus
grande sécurité (un intval()) et les données sont automatiquement
numéric, donc plus de sécurité ;)

        // Il n'y as pas un champs Id_vetement ?

        // ou alors, plus simple un $i (incrémenté à chaque boucle)

        $vetementId=urlencode($Pressing['vetement_p']);


        echo<<< EOS
  <tr>

        <td>{$Pressing['vetement_p']}</td>

        <td>{$Pressing['tarif_p']} &amp;euro;</td>

        <td></td>

        <td></td>

  </tr>

EOS;
// Là, on
met dans un même formulaire, sous le nom INFO toutes les valeurs que
l'on veut récupérer, pour pouvoir les récupérés sous la forme d'un
Array() (-> $_POST['infos'] = array())
}

?>

Petite note :
echo <<< EOS
EOS;
(faire TRES attention à cette mise en forme, il faut mettre impérativement un saut de ligne apres le premier <<< EOS et avant le dernier (aucun espace entre le saut à la ligne et le EOS;)
Cest ni plus ni moinsqu'un echo normal mais avec une convention (typage du text) (tu as des équivalents avec SQL, EOSPAGE, ...)

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
30
Date d'inscription
mercredi 22 août 2007
Statut
Membre
Dernière intervention
24 juin 2008

Un grand merci a vous les gars et particulièrement a toi Jojo!!!!!
Le hic c'est que je ne crois pas que ce soit ça.
Par contre pour toi Jojo, outre un grand grand merci, tout ça dépasse mes compétences pour le moment, mais je le garde sous la main pour faire des recherches afin de le comprendre, donc vraiment merci.

En fait pour mon problème, pour faire simple, j'ai sur une ligne une checkbox, et en face un imput (qui reçoit une valeure numérique, 2, 4, 88...).
Il y a autant de checbox et d'imput que de vetement dans le pressing, le tout généré par une boucle, là c'est ok.
Ce que je veux, c'est que lorsque la checkbox est cochée, qu'il me rapporte le vetement concerné (ça c'est ok) ainsi que la valeur rentrée dans l'input (genre 2, 5...) et c'est là que ça bloque. Impossible de récupérer ça.
Le mieux que j'arrive a faire est de faire marcher le script mais avec la première valeure oubliée avec ça:

<?php
$vet = $_POST['vetement'];

$NBvet = $_POST['NBvetement'];
$totalart = count  ($vet);
if (isset($_POST['vetement'])) {
    echo "Vous avez choisi :";
        for ($i 0, $c count($vet); $i < $c; $i++) {
        echo "
"  .$vet[$i]. "";
        echo " x ";
        echo ""  .$NBvet[$i]. "";
       

    }   
   
echo "
Au total " .$totalart. " types d'articles";

   
    }
   

?>
 (Alors pour Jojo, je met les verif, mais là pour faire simple j'ai mis le minimum).

Donc voila, une ligne, avec une checkbox et un input, si la checkbox renvoi "on" alors prendre l'id du vetement (ok) ainsi que la valeur de l'input (et c'est là que je bloque)...
En tout cas merci pour tout.
PS: j'ai bien fait le print-r, mais il me renvoi toute une série de chiffre meme s'ils ne sont pas rentrés....

Lolo
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Hum ... En fait, mon script est je pense ce que tu veux faire (faut faire gaffe aux espaces manquants ... si tu test normalement ça va buguer ... faut en rajouté après les echo)

Sinon, je vais tester ton script ce soir et je te tiens au courant.
(même si je pense que ça devrait normaleent fonctionner ...bizzar :s )

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
30
Date d'inscription
mercredi 22 août 2007
Statut
Membre
Dernière intervention
24 juin 2008

Super!!! merci Jojo!!!! vraiment un immense merci!!!
Tu me sors un grosse épine du pied.
J'ai toujours bloqué sur les tableaux et les bouquins que j'ai se cantonent a ne mettre que des exemples sans boucles, ou avec des valeurs déclarées (visibles) genre " Array (pull =>rouge,...)".
Bref là ça marche au poil et vraiment un grand grand merci.
Je vais l'adapter, car suite a cetet liste là il y a quatres autres lites dans la foulée (là il n'y a que vetement, mais après il y a linge, repassage, retouches...).
Puis je vais le compléter avec une multiplication du prix de l'article par la quantitée, ça va me donner un sous total.
Puis je ferai un total des sous totaux pour le prix final.
Je le posterai ici, ça sortira du sujet mais si ça peut aider quelqu'un.
En tout cas Jojo je te suis infiniment reconnaissant.
Je viens de voir que tu n'avais que 17 ans, t'as de l'avenir en tout cas.
Encore merci!!!!
PS: désolé pour la réponse tardive, crétin.fr a fait des siennes...

Lolo
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
Plop ;)

^______^

Bah, avec ce que tu veux faire, c'est pas bien compliqué ... une petite multiplication, des additions. La seule difficulté ça va être avec le prix (tu dois faire une requete pour récupérer le prix (c'est pas sûr si on passe par un formulaire ...) puis tu mets tout dans un tableau et avec une recherche ID (produit).

17 ans ? ah oui ^^ c'est jsute que mes 18 sont dans quelques jorus ... ça me semble déjà si loin mes 17 printemps ;) Et pis, il y a (bien) meilleur que moi .... je ne suis qu'autodidacte (j'ai pas pris de cours) je dois encore m'améliorer ;)

<hr />Si ma reponse te convient, merci de l'accepter ! 
Messages postés
30
Date d'inscription
mercredi 22 août 2007
Statut
Membre
Dernière intervention
24 juin 2008

Alors bon anniversaire pour dans qq jours lolllll
Moi c'est trente dans qq jours, et je suis bien moins bon que toi (bon j'avais débuté seul aussi, puis j'ai relaché pendant 9 mois là, du coup tout perdu, mais les array ont tjs été ma bête noire).
Pour répondre a ton message, oui je récupére les tarifs via ma boucle, en gros j'ai l'ID, le nom du vetement et le tarif, c'est $tab2 qui vaut $Pressing['tarif_p'];
while($Pressing = mysql_fetch_array($PressingList))
{  
    $tab   = $Pressing['vetement_p'];
    $tab2  = $Pressing['tarif_p']; //ICI
    $tabid = $Pressing['ID_pressing']; // ID_pressing ??? C'est l'équivalent de ID_vetement ... ?
Donc je le multiplis par la veleur de l'input correspondant, et à la fin je récupére tout pour l'addition.
Je fais ça sans doute demain et je le poste là.
Encore merci pour tout!!! et fêtes bien tes 18 ans!

Lolo
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
^^

Oki oki ... dans ce cas je te conseils cetet méthode :

// [^] Ma requete SQL

/* Enregistrement infos */
$infos_sql = array();
while($Pressing = mysql_fetch_array($PressingList))
{
    // On enregistre les informations de la requete, dans un array. Il est l'"image" de ta requete, et peu être REutilisé ...
    $infos_sql[ $Pressing['ID_pressing'] ] = $Pressing;
}

// [...]

/* Traitement : enregistrement */

// Le code donné plus haut (partie enregistrement). Et ici, tu as pour $infos_sql[$key]['tarif_p'], le prix de l'article $key.
// Biensûr, n'oublie pas une vérification (ici, obligatoire pour pas que ton script plante en cas de mauvais ID) de l'existance de l'ID
/*
    if( !isset($NBvet[$key], $infos_sql[$key]) )
    {
       continue;
    }
*/


// [...]

/* Exploitation : formulaire */
// On exploite les informations de l'array
foreach( $infos_sql as $key => $Pressing )
{
    $tab   = $Pressing['vetement_p'];
    $tab2  = $Pressing['tarif_p'];    $tabid $Pressing['ID_pressing']; <gras>// or " $tabid $key; "</gras>
    // Mon formulaire
}

Et merci ^^ Et obon futur anniv à toi aussi ^^

Aller, courage ;)
<hr />Si ma reponse te convient, merci de l'accepter !