Formulaire et récupération de données

Rechercher

Formulaire et récupération de données

Par yann18  -  14 reponses  -  Le 11/02/2010 10:50  -  Editer  - 

Bonjour,

J'ai un formulaire avec des entrées de ce type:

<input name="prod[0]" type="text" id="prod[0]" value="Fondant blanc" size="60" readonly>
<input name="idRecord[0]" type="hidden" id="idRecord[0]" value="1"></td>
<td><input name="qt[0]" type="text" id="qt[0]" value="15" size="5"
...
<input name="prod[1]" type="text" id="prod[1]" value="Sucre semoule" size="60" readonly>
<input name="idRecord[1]" type="hidden" id="idRecord[1]" value="2">

Je voudrais par la suite récupérer ces données transmises à travers une boucle:

foreach ($_POST as $key => $value) {
            echo $_POST['prod'][$key];
}

 

Mais je n'y arrive pas. J'accède bien aux tableaux 'prod', 'idRecord'..., mais pas à leur contenu. Qu'est ce qui me manque pour lire 'Fondant blanc', 'Sucre simple' etc. merci,

 

Réponses apportées à cette discussion

Par Cyrano  -  Le 11/02/2010 14:16  -  Haut de page  - 

Salut,

dans la super-Globale, tu vas en principe trouver :

  • $_POST['prod'][0] = "Fondant Blanc"

  • $_POST['prod'][1] = "Sucre semoule"

Donc pour simplifier, voici comment procéder :

Première option :

/* On compte les produits */
$nbProduits = count($_POST['prod']);
/* On boucle pour afficher les données */
for($i = 0; $i < $nbProduits; $i++)
{
    echo $_POST['prod'][$i];
}

Deuxième option avec foreach :

foreach($_POST['prod'] as $key => $val)
{
    echo($_POST['prod'][$key]);
    // Ou bien :
    echo($val);
}

 

Note bien les index utilisés selon le cas, en particulier dans la version foreach()

 
Par yann18  -  Le 11/02/2010 14:43  -  Haut de page  - 

Merci beaucoup Cyrano!

 
Par yann18  -  Le 22/02/2010 17:25  -  Haut de page  - 

Bonsoir,

Je reviens sur ce sujet car je peine sur un point, décris dans mon premier post, à savoir distribuer le cout en fonction de la quantité. L'utilisateur doit renseigner pour chaque ligne un cout global pour une quantité donnée. Cette quantité peut-être une somme calculée à l'écran si le produit est présent plus d'une fois dans la table. Si ce produit en question se trouve une fois dans la base, pas de problème, mais s'il existe plusieurs fois, je dois pouvoir diviser ce cout en fonction de chaque quantité de ce même produit. (je ne sais pas si je suis très clair là...) Bref, cela se traduit par un petit produit en croix... Et ça marche disons au 2/3 tiers :? Le hic que je rencontre est que le script me calcule et me met bien à jour le coût des produits présent 1 fois, mais il s'arrête à la deuxième occurrence d'un même produit et passe au suivant sans qu'il y ait cette fois-ci d'actualisation. Pourquoi ?

foreach($_POST['idRecord'] as $key => $id) {
// parcours de la table pour chercher chaque quantité, de chaque produit
$select = "SELECT quantite FROM `compta` WHERE `idCompt` = '".$id."'";
$requete = mysql_query($select) or die('Erreur SQL! Nous avons un problème avec la base de données.');
$data = mysql_fetch_array($requete);
// calcul et mise à jour de la table
$update1= "UPDATE compta SET cout='".($data['quantite'] * $_POST['cout'][$key])/ $_POST['qt'][$key]."'
WHERE idCompt='".$id."'";
$requete2 = mysql_query($update1) or die('Erreur SQL! Nous avons un problème avec la base de données.');
}

Merci pour vos lumières,

 
Par Cyrano  -  Le 22/02/2010 17:41  -  Haut de page  - 

Je n'ai pas compris grand chose du problème.

 

Un détail : prends l'habitude d'indenter ton code (incluant le SQL), la lecture n'en sera que facilitée comme ceci :

foreach($_POST['idRecord'] as $key => $id)
{
    // parcours de la table pour chercher chaque quantité, de chaque produit
    $select   = "SELECT quantite ".
                "FROM `compta` ".
                "WHERE `idCompt` = '".$id."'";
    $requete = mysql_query($select) or die('Erreur SQL : '. mysql_error());
    $data = mysql_fetch_array($requete);
    // calcul et mise à jour de la table
    $update1 =  "UPDATE compta SET ".
                "cout='".($data['quantite'] * $_POST['cout'][$key])/ $_POST['qt'][$key]."' ".
                "WHERE idCompt='". $id ."'";
    $requete2 = mysql_query($update1) or die('Erreur SQL : '. mysql_error());
}

Enfin bon ceci dit, essaye de reformuler ta question parce que je ne saisis pas la nature exacte de ton problème...

 
Par yann18  -  Le 23/02/2010 11:08  -  Haut de page  - 

Bonjour,

Ok, plutôt qu'un long discours, des images seront peut-être plus parlantes. La première image est un formulaire généré à partir d'une table. Les quantités sont additionnées pour l'écran si le produit est en doublon. On le voit bien dans la table : j'ai une fois de la longe de porc, mais deux fois des lardons fumés, d'où le chiffre 3 pour la quantité de lardons dans le formulaire. Le script met en relation le formulaire et la table. Il doit calculer et mettre à jour pour chaque produit le cout renseigné par l'utilisateur à l'écran. Dans la table, le prix pour la ligne 27 est correct (proportionnellement parlant) J'ai bien une quantité globale de 3 pour un cout totale de 6 euros (c'est fictif évidemment), avec une quantité de 2 pour cette ligne. Donc (2 * 6)/ 3 = 4 euros. Ce produit en croix doit être répété pour chaque ligne. La ligne 28 a été oubliée, mais pas la 29, pourquoi ? Le problème se répète pour chaque doublon de produit. Comment remédier à cela ? En espérant avoir été plus clair...

Merci,

 
Par yann18  -  Le 24/02/2010 11:58  -  Haut de page  - 

Bonjour, Le problème avance un peu si j'ose dire... En fait, il vient de la requête qui génère le formulaire.

SELECT idCompt, designation, SUM(quantite) AS quantite
        FROM `compta`
        WHERE `nBonCom` = '".$_SESSION['nBonCom']."'
        GROUP BY designation

Un extrait du formulaire en lui même pour rappel:

<td><input name="prod[29]" id="prod[29]" value="Boudin antillais" size="60" readonly="readonly"  type="text"></td>
<td><input name="qt[29]" id="qt[29]" value="1.0" size="5" readonly="readonly" type="text"></td>
<td><input name="cout[29]" id="cout[29]" size="10" type="text"></td>
...
<td><input name="prod[25]" id="prod[25]" value="Carré de porc 4 côtes" size="60" readonly="readonly" type="text"></td>...

De ce fait, je ne dispose plus de la totalité des identifiants (idCompt) dans la table, puisque "regroupés". Et les résultats de la requête suite à la boucle s'en trouvent naturellement faussés...

foreach($_POST['idRecord']  AS $key =>  $id)  {
//            parcours de la TABLE pour chercher chaque quantité, de chaque produit
            $select = "SELECT quantite
            FROM `compta`
            WHERE `idCompt` = '".$id."'";
...

Ainsi que mes calculs de TVA:

$cout = ($data['quantite'] * $_POST['cout'][$key])/ $_POST['qt'][$key];
$ttc = empty ($_POST['tva'][$key]) ? $cout + ($cout * 0.196) : $cout + ($cout * 0.055);

Le seul rapport valable que je puisse trouver entre le formulaire et la table sont les produits (designation). Correction apportée:

foreach($_POST['prod'] AS $key => $prod)  {
//           parcours de la TABLE pour chercher chaque quantité, pour chaque produit
            $select = "SELECT idCompt, designation, quantite
                FROM `compta`
                WHERE `designation` = '".$prod."'";

Ca marche nettement mieux en opérant de cette façon, mais ce n'est pas suffisant. Le ration coût/ quantité n'est toujours pas respecté.

Comment puis-je corriger cela? merci,

 
Par Cyrano  -  Le 24/02/2010 13:12  -  Haut de page  - 

Salut,

déjà, la récupération de la clé primaire avec une clause GROUP BY n'a pas trop d'intérêt. Ensuite, si je me base sur la premi`;ere requête, tu ne récupères que la quantité, pas le coût.

Ceci étant, pour qu'on comprenne correctement ce que tu veux faire, il faudrait qu'on ait des données suffisantes.

  1. Des échantillons des données de chacune des tables dans lesquelles se trouvent les données dont tu as besoin pour l'affichage (toutes les colonnes);
  2. Au besoin des explications sur les liens entre les différentes tables et à quoi correspond chaque colonne dans le cas où le nom serait ambigu ou peu significatif;
  3. Le résultat que tu voudrais obtenir sur la base du jeu d'essai présenté en 1
  4. Le résultat effectivement obtenu à ce stade avec ce même jeu d'essai

À partir de là on pourra te guider vers la solution plus clairement.

 

 
Par yann18  -  Le 24/02/2010 15:48  -  Haut de page  - 

Ok, je vais reprendre par le commencement. Déjà par le formulaire, qui ne représente finalement qu'un bon de commande, ou un ticket de caisse. L'utilisateur doit saisir pour chaque produit et sa quantité un cout. Ce formulaire, ainsi que tout le code qui en découle ne repose que sur une seule table:

-- Structure de la table `compta`
CREATE TABLE IF NOT EXISTS `compta` (
  `idCompt` int(4) NOT NULL AUTO_INCREMENT,
  `nBonCom` int(10) NOT NULL,
  `designation` text COLLATE utf8_unicode_ci NOT NULL,
  `quantite` decimal(10,1) NOT NULL,
  `section` text COLLATE utf8_unicode_ci NOT NULL,
  `idUser` int(2) NOT NULL,
  `cout` decimal(5,2) NOT NULL,
  PRIMARY KEY (`idCompt`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=34 ;

Maintenant un échantillon de ce que contient cette table:

(25, 2010027, 'Carré de porc 4 côtes', '2.0', 'Adultes', 3, '0.00'),
(26, 2010027, 'Longe de porc', '1.0', 'Adultes', 3, '0.00'),
(27, 2010027, 'Lardons fumés', '2.0', 'Adultes', 4, '0.00'),
(28, 2010027, 'Lardons fumés', '1.0', 'CAP', 4, '0.00'),
(29, 2010027, 'Boudin antillais', '1.0', 'CAP', 4, '0.00'),
(30, 2010028, 'Poitrine fumée', '2.0', 'Adultes', 3, '0.00'),
(31, 2010028, 'Bacon', '1.0', 'CAP', 4, '0.00'),

Le formulaire doit présenter une vision globale de cet échantillon par exemple.Si un produit est présent deux fois dans la table (lardons fumés), il n'apparaîtra qu'une seule fois dans le formulaire, et la quantité sera la somme des deux quantités. Vous pouvez avoir une image du formulaire avec ce même échantillon dans mon post datant du 23 /02.

Un fois que les couts ont été renseignés et le formulaire validé, le script doit même mettre à jour toute la colonne cout de la table compta avec un calcul de tva (taxe à 5,5 ou 19,6 selon si la case dans le formulaire sera décochée ou pas), et ce en fonction de la quantité des produits.

Donc le résultat que je voudrais obtenir est ceci:

(25, 2010027, 'Carré de porc 4 côtes', '2.0', 'Adultes', 3, '8.44'),
(26, 2010027, 'Longe de porc', '1.0', 'Adultes', 3, '4.22'),
(27, 2010027, 'Lardons fumés', '2.0', 'Adultes', 4, '3.52'),
(28, 2010027, 'Lardons fumés', '1.0', 'CAP', 4, '1.76'),
(29, 2010027, 'Boudin antillais', '1.0', 'CAP', 4, '5.28'),
(30, 2010028, 'Poitrine fumée', '2.0', 'Adultes', 3, '0.00'),
(31, 2010028, 'Bacon', '1.0', 'CAP', 4, '0.00'),

Deux choses à propos de ceci - Le cout est redistribué proportionnellement selon la quantité de lardons, avec une tva à 5.5% Dans le formulaire, l'utilisateur à écrit 5 euros pour une quantité de 3. - Les lignes 30 et 31 ne sont pas renseignées, car il s'agit du bon de commande 2010028

Maintenant ce que j'obtiens avec le script (la dernière version)

(25, 2010027, 'Carré de porc 4 côtes', '2.0', 'Adultes', 3, '8.44'),
(26, 2010027, 'Longe de porc', '1.0', 'Adultes', 3, '4.22'),
(27, 2010027, 'Lardons fumés', '2.0', 'Adultes', 4, '3.52'),
(28, 2010027, 'Lardons fumés', '1.0', 'CAP', 4, '3.52'),
(29, 2010027, 'Boudin antillais', '1.0', 'CAP', 4, '5.28'),
(30, 2010028, 'Poitrine fumée', '2.0', 'Adultes', 3, '0.00'),
(31, 2010028, 'Bacon', '1.0', 'CAP', 4, '0.00'),

C'est presque ça... sauf que la ligne 28 n'est pas mise à jour correctement : le cout est le même.

Merci,

 

 

 
Par yann18  -  Le 24/02/2010 15:52  -  Haut de page  - 

Je remets aussi dans l'ordre le script:

foreach($_POST['prod'] as $key => $prod) {
//           parcours de la table pour chercher chaque quantité, pour chaque produit
            $select = "SELECT idCompt, designation, quantite
                FROM `compta`
                WHERE `designation` = '".$prod."'";
            $requete = mysql_query($select) or die('Erreur SQL! Nous avons un problème avec la base de données.');
            $data = mysql_fetch_array($requete);
//
//            calcul de la tva
            $cout = ($data['quantite'] * $_POST['cout'][$key])/ $_POST['qt'][$key];
            $ttc = empty ($_POST['tva'][$key]) ? $cout + ($cout * 0.196) : $cout + ($cout * 0.055);
//
//            et mise à jour de la table
            $update1= "UPDATE compta
                SET cout='".$ttc."'
                WHERE designation='".$prod."'";
            $requete2 = mysql_query($update1) or die('Erreur SQL! Nous avons un problème avec la base de données.');
}
 
Par Cyrano  -  Le 24/02/2010 16:00  -  Haut de page  - 

Ok, ça se complète.

Malheureusement là je manque de temps depuis le bureau. Je regarderai ça ce soir.

@+

 
Par Cyrano  -  Le 24/02/2010 20:32  -  Haut de page  - 

Bon, je viens de regarder : il me manque deux éléments, j'ai l'impression que ce que tu cherches à faire est impossible de façon simple.

La première chose, ce serait le code de ton formulaire que je vois de quoi il a l'air et quelles sont les données qui sont dedans;

Le seconde, ce sont les données reçues pour le traitement. Pour ça, tu vas ajouter ça en début de page de traitement :

<?php
echo("<pre>\n");
var_dump($_POST);
echo("</pre>\n");
// suite normale du code

Envoie le résultat qui va s'afficher lorsque tu postes le formulaire.

 

 
Par yann18  -  Le 25/02/2010 09:56  -  Haut de page  - 

Bonjour,

Ok, mais avant de te donner les autres informations, je dois parler de quelque chose qui a peut-être son importance dans le processus et sur lequel je n'ai pas trop disserté jusqu'à présent. Avant que le formulaire ne s'affiche, l'utilisateur doit choisir dans une liste un numéro de bon de commande. On peut retrouver ces numéros dans la table (colonne nBonCom) Une fois le choix validé, le formulaire va être généré en fonction de ce numéro. Dans le cas présent, il s'agit du numéro 2010027 (qui correspond également aux échantillons de la table donnés dans mon précédent post) et il va donné comme code:

...






















































































































































...

Désolé pour la mise en forme, mais j'ai l'impression que ton application d'insertion de code a du mal. J'ai essayé 4-5 fois avant de déposer les armes, que ce soit sous firefox ou IE. Idem pour les autres langages. Une précision concernant ce code : les valeurs entre crochets proviennent également de la table et plus de la colonne 'idCompt'. Pour rappel, le formulaire est généré par cette requête: $select = "SELECT idCompt, designation, SUM(quantite) AS quantite FROM `compta` WHERE `nBonCom` = '".$_SESSION['nBonCom']."' GROUP BY designation";

Maintenant, les résultats de ce formulaire avec var_dump:

array(6) {  ["prod"]=>  array(4) {    [29]=>    string(16) "Boudin antillais"    [25]=>    string(23) "Carré de porc 4 côtes"    [27]=>    string(14) "Lardons fumés"    [26]=>    string(13) "Longe de porc"  }  ["idRecord"]=>  array(4) {    [29]=>    string(2) "29"    [25]=>    string(2) "25"    [27]=>    string(2) "27"    [26]=>    string(2) "26"  }  ["qt"]=>  array(4) {    [29]=>    string(3) "1.0"    [25]=>    string(3) "2.0"    [27]=>    string(3) "3.0"    [26]=>    string(3) "1.0"  }  ["cout"]=>  array(4) {    [29]=>    string(1) "5"    [25]=>    string(1) "8"    [27]=>    string(1) "6"    [26]=>    string(1) "4"  }  ["tva"]=>  array(4) {    [29]=>    string(3) "5.5"    [25]=>    string(3) "5.5"    [27]=>    string(3) "5.5"    [26]=>    string(3) "5.5"  }  ["btn"]=>  string(8) "Archiver"}

Merci beaucoup!

 
Par yann18  -  Le 25/02/2010 10:03  -  Haut de page  - 

Apparemment un souci d'affichage avec les résultats: array(6) { ["prod"]=> array(4) { [29]=> string(16) "Boudin antillais" [25]=> string(23) "Carré de porc 4 côtes" [27]=> string(14) "Lardons fumés" [26]=> string(13) "Longe de porc" }

["idRecord"]=> array(4) { [29]=> string(2) "29" [25]=> string(2) "25" [27]=> string(2) "27" [26]=> string(2) "26" }

["qt"]=> array(4) { [29]=> string(3) "1.0" [25]=> string(3) "2.0" [27]=> string(3) "3.0" [26]=> string(3) "1.0" }

["cout"]=> array(4) { [29]=> string(1) "5" [25]=> string(1) "8" [27]=> string(1) "6" [26]=> string(1) "4" }

["tva"]=> array(4) { [29]=> string(3) "5.5" [25]=> string(3) "5.5" [27]=> string(3) "5.5" [26]=> string(3) "5.5" }

["btn"]=> string(8) "Archiver" }

 
Par Cyrano  -  Le 25/02/2010 10:09  -  Haut de page  - 

Ok, ben comme hier : là je suis au bureau et j'ai pas le temps, je regarderai plus en détail ce soir.

Mais d'ici là, tu as le temps de réfléchir à un truc : les données sont récupérées avec un GROUP BY, donc la clause de regroupement ne permet théoriquement pas de récupérer la clé primaire : c'est de la logique élémentaire, penses-y soigneusement. En conclusion, procéder à une mise à jour implique dans ce cas que tu devras utiliser un autre point de repère. Et la valeur idCompt n'a rien à faire à parce qu'elle ne concerne qu'une seule ligne même les les autres valeurs de la ligne de données sont bonnes, la clé primaire est fausse.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |