[RESOLU]Formulaire et tableau: maj table

Formulaire et tableau: maj table [RESOLU] - PHP - Programmation

Marsh Posté le 16-12-2006 à 21:20:24    

Bonjour,
 
J'ai une table dont la structure est:
 
Champ1   champ2   champ3   champ4   champ5
idunique   id           nom        qte         pu
auto+
 
et remplie par:
 
1           1             art1        12            11
2           1             art2        10            24
3           2             art3        20            40
 
A l'aide d'une requête portant sur champ2=1 par exemple, j'affiche ds un formulaire, sur 3 colonnes et 2 lignes, les données (art1, 12, 11) pour la 1ère ligne et (art2, 10, 24) pour la 2nde ligne.
 
Je souhaite pouvoir modifier, ds le formulaire, l'une ou plusieurs de ces valeurs et mettre à jour ma table.
Les données sont rangées ds un tableau multidimensionnel contenant 3 tableaux - correspondants aux champs 3 à 5.  
 
Mon tableau est correctement rempli mais invariablement ma table contient les 2 mêmes enregistrements! correspondants à la 2nde ligne du formulaire.
 
Je ne comprends pas .... et ça m'escagaceeee légèrement franchement, pourquoi les 2 lignes ne sont pas distinguées.
 
Merci pour vos avis et votre aide, j'apporte des précisions si nécessaire.
 
J'aimerai poster mon code mais je ne vois pas de coloration syntaxique de proposer pour php, comment faire svp?

Message cité 1 fois
Message édité par piedbleu le 17-12-2006 à 17:02:47
Reply

Marsh Posté le 16-12-2006 à 21:20:24   

Reply

Marsh Posté le 16-12-2006 à 21:55:40    

piedbleu a écrit :


J'aimerai poster mon code mais je ne vois pas de coloration syntaxique de proposer pour php, comment faire svp?


 
le bouton http://forum-images.hardware.fr/icones/message/c.gif fonctionne aussi pour php :)
 
Sinon, tu identifies tes enregistrements dans le formulaire ?

Reply

Marsh Posté le 16-12-2006 à 22:33:57    


Sinon, tu identifies tes enregistrements dans le formulaire ?[/quotemsg]
 
no comprendo la question ... j'affiche un formulaire vide pour enregistrement ds une table et affectation à une variable - mon tableau -;je réaffiche ce formulaire rempli des saisies précédentes; je modifie la saisie, enregistre cette modif ds mon tableau - c'est ok - et mets à jour la table : big pbm.
 
Ci - dessous mon code, très court, seuls les print_r prennent de la place.  
Pour l'exemple je force champ2 à 1 - voir mon 1er post.
 
A nouveau merci pour tte contribution !
 
--- essaitrait.php ---  
- traitement des variables postées et insertion/maj de la table -
 

Code :
  1. <?php
  2.                 include('include/connexion.php');
  3.                 $etape = 0;
  4.                 $idcommande = 1;
  5.                
  6.                 if (isset($_REQUEST['etape']) & !empty($_REQUEST['etape'])) {
  7.                    $etape = $_REQUEST['etape'];
  8.                 }
  9.                
  10.                 if (isset($_REQUEST['idcommande']) & !empty($_REQUEST['idcommande'])) {
  11.                    $idcommande = $_REQUEST['idcommande'];
  12.                 }
  13.                 switch ($etape) {
  14.                                    
  15.                 case "0": // saisie formulaire  
  16.                          $etape = 1;
  17.                          include('essaiform.php');
  18.                 break;
  19.                
  20.                 case "1": // enregistrement et affichage pour modifs  
  21.                          // test contenu de la variable article postée: OK  
  22.                          echo 'contenu de article posté: test ok';
  23.                          echo '<pre>';
  24.                          print_r($_POST["article"]);
  25.                          echo '</pre>';
  26.                          // affectation de la variable postée  
  27.                          for($i=0;$i<=1;$i++){
  28.                          $article["nom"] = $_POST["article"]["nom"];
  29.                          $article["qte"] = $_POST["article"]["qte"];
  30.                          $article["pu"] = $_POST["article"]["pu"];
  31.                          }
  32.                          // test contenu de la variable affectée: OK  
  33.                          echo 'contenu de article affecté: test ok';
  34.                          echo '<pre>';
  35.                          print_r($article);
  36.                          echo '</pre>';
  37.                          // insertion ds la table: OK  
  38.                          for($i=0;$i<=1;$i++){
  39.                          $req1="insert into essaiarticle (idcommande, nom_art, qte, pu )
  40.                          values($idcommande, '{$article[nom][$i]}', '{$article[qte][$i]}', '{$article[pu][$i]}' )";
  41.                
  42.                          $rep1=mysql_query($req1)or die("Enregistrement ds table article impossible" );
  43.                          }
  44.                          echo $idcommande;
  45.                          $etape=2;
  46.                          include('essaiform.php');
  47.                 break;
  48.                 case "2": // maj enregistrement suite modifs de saisie  
  49.                          // affectation suite maj  
  50.                          for($i=0;$i<=1;$i++){
  51.                          $article["nom"] = $_POST["article"]["nom"];
  52.                          $article["qte"] = $_POST["article"]["qte"];
  53.                          $article["pu"] = $_POST["article"]["pu"];
  54.                          }
  55.                          // ICI PROBLEME: REQUETE NON PRISE EN COMPTE - ARRGHHH !  
  56.                          for($i=0;$i<=1;$i++){
  57.                          $req2="UPDATE essaiarticle SET nom_art='{$article[nom][$i]}', qte='{$article[qte][$i]}', pu='{$article[pu][$i]}'
  58.                          WHERE idcommande='$idcommande'";
  59.                          $rep2=mysql_query($req2)or die("MAJ table article impossible" );
  60.                          }
  61.                          
  62.                          echo $idcommande;
  63.                          echo 'contenu de article maj: test OK';
  64.                          echo '<pre>';
  65.                          print_r($article);
  66.                          echo '</pre>';
  67.                          include('essaiform.php');
  68.                 }
  69. ?>


--- essaiform.php ---  
- affichage du formulaire -
 

Code :
  1. <table>
  2.                    <form name="devis" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  3.                  
  4.                            <?php
  5.                            for($i=0;$i<=1;$i++){    ?>
  6.                    <tr>
  7.                               <!-- saisie refs article -->
  8.                               <td><input type="text" name="article[nom][]" value="<?php echo $article[nom][$i]; ?>" size="30" maxlength="35"></td>
  9.                               <td><input type="text" name="article[qte][]" value="<?php echo $article[qte][$i]; ?>" size="13" maxlength="35"></td>
  10.                                <td><input type="text" name="article[pu][]" value="<?php echo $article[pu][$i]; ?>" size="13" maxlength="35"></td>
  11.                            </tr>
  12.                          
  13.                            <?php      }    ?>
  14.                          
  15.                            <tr>   
  16.                                    <input type="hidden" name="idcommande" value="<?php echo $idcommande; ?>">
  17.                                    <input type="hidden" name="etape" value="<?php echo $etape; ?>">
  18.                      <!--          <td><input type="submit" name="valider" value="Ajouter"></td>     -->
  19.                            </tr>
  20.                          
  21.                            <tr>
  22.                                <td><input type="submit" name="valider" value="Enregistrer"></td>
  23.                            </tr>
  24.                            </form>
  25.                          
  26. </table>


 
 
 

Reply

Marsh Posté le 16-12-2006 à 22:38:06    

Le pbm. se situe ds la requête de mise à jour de la table:
essaitrait.php => case "2" => $req2= ...

Reply

Marsh Posté le 16-12-2006 à 22:53:56    

Bon, il y a déjà un gros problème dans ta boucle

Code :
  1. // affectation de la variable postée
  2. for($i=0;$i<=1;$i++){
  3. $article["nom"] = $_POST["article"]["nom"];
  4. $article["qte"] = $_POST["article"]["qte"];
  5. $article["pu"] = $_POST["article"]["pu"];
  6. }


 
parce que là, à chaque passage dans la boucle, tu écrases ce que le tableau $article contenait déjà => $article["nom"][] = ... et ainsi de suite.
 
Puis la logique même de la mise à jour me semble bancale, la clause where de ton update va mettre à jour de la même manière tous les articles d'une commande ou tu as un idcommande différent pour chaque article commandé ?

Reply

Marsh Posté le 16-12-2006 à 23:29:44    

>> tu écrases ....
Ce qui expliquerait qu'après mise à jour ma table contienne les 2 mêmes enregistrements correspondants à la dernière ligne du formulaire?
Ds ce cas la boucle est mauvaise et je veux bien de l'aide car j'ai un gros souci.
.... malgré le fait que $article soit lui correctement affecté : le print_r qui suit l'update.
 
La logique du truc peut surprendre, mais je cherche à faire une mise à jour sur un id non unique : champ2 ds mon exemple. Est ce possible?

Reply

Marsh Posté le 16-12-2006 à 23:44:14    

En fait le pbm. est là, tu dis:
 
"" la clause where de ton update va mettre à jour de la même manière tous les articles ... "
 
... oui c'est ce qui se passe et j'ajoute :
pour "tous les articles": tque champ2=1 pour l'exemple.
pour " de la même manière ": avec les valeurs de la dernière ligne.
 
Le fait qu'après mise à jour mon tableau $article soit correctement affecté ET que la maj de la table déconne m'échappe complètement.
 
Comment se fait il que lors de l'update les deux lignes du formulaire ne soit pas distinguées? Je veux bien un coup de main là - dessus!

Reply

Marsh Posté le 17-12-2006 à 00:13:34    

Mes excuses pour ces messages en rafale mais qd. on a le nez ds le guidon on ne voit plus la route.
 
Pour reprendre ta remarque sur la boucle Naceroth, la variable $i incrémentée à chaque tour n'apparaît pas ds la boucle elle - même, donc effectivement gros souci - d'où les écrasements? :j'essaie des corrections.
 
Mon aisance avec la gestion des tableaux est finallement tte relative, malgré des lectures attentives de tutos et consultations de forums et faq où ces questions reviennent très souvent, chacun les mettant à la sauce de sa propre appli.
 
Si l'un d'entre vous après avoir survolé le début de cet échange se demande pourquoi s'emmerder avec des indices pour boucler et voit une solution tte naturelle employant de manière limpide des foreach, alors bien sur je ne demande qu'à être irradié de cette lumière.
 
Du reste il n'est pas simple d'intervenir comme ça sur des détails, donc j'en apporte davantage à qui veut :) !
 
 
 
 

Reply

Marsh Posté le 17-12-2006 à 02:50:24    

Alors j'ai relu le code en étant moins pressé de répondre et j'ai remarqué que j'avais dit une bêtise plus haut, même si tu ne l'as probablement pas fait exprès :D
 
En fait, tu n'as pas besoin de faire une boucle pour ta première boucle (hum, ça veut rien dire cette phrase)

Code :
  1. $article["nom"] = $_POST["article"]["nom"];
  2. $article["qte"] = $_POST["article"]["qte"];
  3. $article["pu"] = $_POST["article"]["pu"];


 
écrire juste ça à la place de la première boucle va copier un tableau dans un élément d'un autre tableau, ce qui explique le print_r correct, le problème est situé dans l'autre boucle.
 

Citation :


Comment se fait il que lors de l'update les deux lignes du formulaire ne soit pas distinguées? Je veux bien un coup de main là - dessus!


 
Comme souvent, la réponse la plus simple est souvent correcte : parce qu'il n'a aucun moyen de les distinguer. Tu fais un update en te basant sur un champs que les deux lignes ont en commun, il faut utiliser un champ unique (le champ1 de ton exemple plus haut) pour différencier les deux lignes.
 
Donc, il te faut modifier le formulaire pour ajouter pour chaque article l'identifiant unique qui va permettre de déterminer quelle ligne modifier et utiliser cet identifiant dans la clause where de ton update.

Reply

Marsh Posté le 17-12-2006 à 17:02:10    

OK, vu pour le tableau, je vérifierai.
 
Pour l'id unique je dirai .... hum bon sang mais c'est bien sûr :).
 
Je devrai donc m'en sortir : merci!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed