Page 1 sur 1

formulaire dynamique et modification de table

Posté : 02 févr. 2010, 16:14
par albius
Bonjour,

J'ai un formulaire avec des noms de champs établis dynamiquement, et dont les valeurs proviennent d'une table
<td><input name="prod[]" type="text" id="prod[]" value="Fondant blanc" size="60" readonly>
<input name="idRecord[]" type="hidden" id="idRecord[]" value="1"></td>
<td><input name="qt[]" type="text" id="qt[]" value="15" size="5" readonly></td>
<td><input name="cout[]" type="text" id="cout[]" size="10"></td>
<td><input type="checkbox" name="tva[]" id="tva[]"></td>
L'utilisateur doit renseigner pour chaque ligne un cout global et valider par la suite.
Deux cas de figures après:
  • Soit le produit existe une fois dans la table de la bdd, et s'effectue un simple 'update' de l'enregistrement avec le cout transmis par l'utilisateur
    Soit il existe plusieurs fois, et dans ce cas, je dois m'arranger pour redistribuer le cout en fonction de la quantité.
Mais c'est le premier point qui me préoccupe pour l'instant. Voici ce que j'ai fait jusqu'à présent:
foreach ($_POST['prod'] as $prod) {
//            Combien de fois le produit est présent dans la table ?
            $select = 'SELECT designation FROM compta WHERE designation= "'.$prod.'"';
            $requete = mysql_query($select) or die('Erreur SQL!');
            $nbre = mysql_num_rows($requete);
//            S'il est présent qu'une seule fois
            if($nbre == 1) {
//                Je fais un "simple" update
               $update= 'UPDATE `alimentaires`.`compta` SET `cout` = "'.$_POST['cout'].'"
                   WHERE `compta`.`idCompt` = "'.$_POST['idRecord'].'" LIMIT 1';
               $requete1 = mysql_query($update) or die('Erreur SQL!');
            }
//            Sinon, j'effectue un calcul
            elseif($nbre > 1) {
                echo 'calcul<br>';
            }
        }
La requête de modification ne renvoie rien, d'où cette question : comment puis-je récupérer précisément les valeurs de $_POST['idRecord'] et de $_POST['cout'] dans cette boucle pour que la requête soit effective ?
merci,

Re: formulaire dynamique et modification de table

Posté : 02 févr. 2010, 18:01
par monpanda
Je pense que c'est ton utilisation des ' et des " qui est incorrecte, de plus compta.idCompt est j'imagine un entier, donc pas de combinaison de ' et ".
Je t'ai mis le code corrigé (enfin j'espère), regarde bien les guillemets (simples et doubles)
Et si $_POST['cout'] est un nombre à virgule et pas du texte, enlève les ' qui l'entourent (mais pas les ").
$select = "SELECT designation FROM compta WHERE designation= '".$prod."';";
            $requete = mysql_query($select) or die('Erreur SQL!');
            $nbre = mysql_num_rows($requete);
//            S'il est présent qu'une seule fois
            if($nbre == 1) {
//                Je fais un "simple" update
               $update= "UPDATE `alimentaires`.`compta` SET `cout` = '".$_POST['cout']."'
                   WHERE `compta`.`idCompt` = ".$_POST['idRecord']." LIMIT 1;";

Re: formulaire dynamique et modification de table

Posté : 11 févr. 2010, 10:47
par albius
Bonjour,

Merci la réponse 'monpanda' (et mes excuses pour la mienne tardive) j'en prends note mais le problème s'est déplacé... j'ai modifié le formulaire pour arriver à cela:
<input name="prod[0]" type="text" id="prod[0]" value="Fondant blanc" size="60" 
<input name="idRecord[0]" type="hidden" id="idRecord[0]" value="1"></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 simple" size="60"
<input name="idRecord[1]" type="hidden" id="idRecord[1]" value="2">
etc.
Pour arriver à ce que je voudrais faire, il me faut d'abord lister les informations provenant de ce formulaire, à l'aide d'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,

Re: formulaire dynamique et modification de table

Posté : 11 févr. 2010, 14:01
par monpanda
<input name="prod[0]" type="text" id="prod[0]" value="Fondant blanc" size="60" 
<input name="idRecord[0]" type="hidden" id="idRecord[0]" value="1"></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 simple" size="60"
<input name="idRecord[1]" type="hidden" id="idRecord[1]" value="2">
etc.
Pour arriver à ce que je voudrais faire, il me faut d'abord lister les informations provenant de ce formulaire, à l'aide d'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,
Premièrement, est ce que tu as mis ton code complet ou est ce que réellement tu ne ferme pas tes balises ?
<input name="prod[1]" type="text" id="prod[1]" value="Sucre simple" size="60"
<!--  devrait être -->
<input name="prod[1]" type="text" id="prod[1]" value="Sucre simple" size="60" />
Deuxièmement, Je ne sais pas si tu utilises une API ou un environnement spécial (ou alors si je ne connais pas cette possibilité), mais pour moi
quand tu donnes "prod[1]" comme valeur à l'attribut name d'une balise, tu ne passe pas l'élément ayant pour index 1 du tableau prod, mais la chaine de caractère "prod[1]" (pareil pour "idRecord[1]").
Fait un:
foreach ($_POST as $key => $value) {
            echo 'clef= '.$key.' , valeur= '.$value.'<br />';
        }
et tu verras ce que contient ton tableau $_POST.

Pour obtenir ce que tu veux, fais name="prod0", name="prod1" etc ... dans ton code HTML,
puis
foreach ($_POST as $key => $value) {
            if(substr($key, 0, 4) == 'prod') {
                echo $value;
           }
}

Re: formulaire dynamique et modification de table

Posté : 11 févr. 2010, 15:10
par albius
En fait, ça va nettement mieux si je fais:
foreach($_POST['prod'] as $k => $prod) {
            echo $_POST['prod'][$k];
}

Re: formulaire dynamique et modification de table

Posté : 11 févr. 2010, 15:17
par stealth35
En fait, ça va nettement mieux si je fais:
foreach($_POST['prod'] as $k => $prod) {
            echo $_POST['prod'][$k];
}

euh...
foreach($_POST['prod'] as $prod) 
{
    echo $prod;
}

Re: formulaire dynamique et modification de table

Posté : 11 févr. 2010, 15:38
par monpanda
D'accord avec stealth35

@ Albius
foreach($_POST['prod'] as $k => $prod) {
            echo $_POST['prod'][$k];
}
Tu obtiens réellement quelque chose avec ce code ??
Pourquoi faire un foreach sur $_POST['prod'] alors que ce n'est pas un tableau, ça ne contient que la valeur du champs dans ton formulaire ayant pour attribut name="prod"

Re: formulaire dynamique et modification de table

Posté : 12 févr. 2010, 16:03
par albius
Effectivement, c'est encore plus simple...
merci,

Re: formulaire dynamique et modification de table

Posté : 22 févr. 2010, 18:05
par albius
bonjour,

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é. Pour être plus explicite, je vais me servir de copies d'écran: ImageImage
La première image est un formulaire généré à partir d'une table (seconde image). 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... Le code:
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,

Re: formulaire dynamique et modification de table

Posté : 24 févr. 2010, 12:41
par albius
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é.
Image
Comment puis-je corriger cela?
merci,