Page 1 sur 1

Formulaire et tableau : maj table

Posté : 15 déc. 2006, 21:43
par Invité
Bien le bonjour,

J'ai une petite appli. toute bête qui affiche un formulaire vide de 2 lignes et 3 colonnes, enregistre les données saisies ds une table, réaffiche le formulaire avec les champs préremplis des données saisies précédemment pour permettre une correction de la saisie et effectue une mise à jour de la table.

Mes données sont stockées ds un tableau multidimensionnel "article", contenant les tableaux "nom", "qte" et "pu" - les 3 colonnes.

L'enregistrement ds la table est ok mais pas la mise à jour!
Au final ma table contient 2 enregistrements identiques : la 2nde ligne du formulaire.

Ci - dessous mon code très court, seuls les print_r prennent de la place :=).
Le pbm. se situe au niveau de $req2 : gestion du tableau ou de la requête sql?

Merci pour votre aide!

--- essaitrait.php ---
- traitement des variables postées et insertion/maj de la table -
<?php
                include('include/connexion.php');

                $etape = 0;
                
                if (isset($_REQUEST['etape']) & !empty($_REQUEST['etape'])) {

                   $etape = $_REQUEST['etape'];
                }
                
                switch ($etape) {
                                	
                case "0": // saisie formulaire
                         $etape = 1;
                         include('essaiform.php');
                break;
                
                case "1": // enregistrement et affichage pour modifs

                         // test contenu de la variable article postée: OK
                         echo 'contenu de article posté: test ok';
                         echo '<pre>';
                         print_r($_POST["article"]);
                         echo '</pre>';

                         // affectation de la variable postée
                         for($i=0;$i<=1;$i++){
                         $article["nom"] = $_POST["article"]["nom"];
                         $article["qte"] = $_POST["article"]["qte"];
                         $article["pu"] = $_POST["article"]["pu"];
                         }

                         // test contenu de la variable affectée: OK
                         echo 'contenu de article affecté: test ok';
                         echo '<pre>';
                         print_r($article);
                         echo '</pre>';

                         // insertion ds la table: OK
                         for($i=0;$i<=1;$i++){
                         $req1="insert into article ( nom_art, qte, pu )
                         values( '{$article[nom][$i]}', '{$article[qte][$i]}', '{$article[pu][$i]}' )";
                
                         $rep1=mysql_query($req1)or die("Enregistrement ds table article impossible");
                         }
                         
                         $etape=2;
                         include('essaiform.php');

                break;
                
                case "2": // maj enregistrement suite modifs de saisie

                         // affectation suite maj
                         for($i=0;$i<=1;$i++){
                         $article["nom"] = $_POST["article"]["nom"];
                         $article["qte"] = $_POST["article"]["qte"];
                         $article["pu"] = $_POST["article"]["pu"];
                         }
                         
                         // ICI PROBLEME: REQUETE NON PRISE EN COMPTE - ARRGHHH !
                         for($i=0;$i<=1;$i++){
                         $req2="UPDATE article SET nom_art='{$article[nom][$i]}', qte='{$article[qte][$i]}', pu='{$article[pu][$i]}'";

                         $rep2=mysql_query($req2)or die("MAJ table article impossible");
                         }
                         
                         echo 'contenu de article maj: test OK';
                         echo '<pre>';
                         print_r($article);
                         echo '</pre>';

                         include('essaiform.php');
                }
?>

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

<table>

	                   <form name="devis" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
	                   
                           <?php 

                           for($i=0;$i<=1;$i++){    ?>

	                   <tr>

                              <!-- saisie refs article -->

                              <td><input type="text" name="article[nom][]" value="<?php echo $article[nom][$i]; ?>" size="30" maxlength="35"></td>

                              <td><input type="text" name="article[qte][]" value="<?php echo $article[qte][$i]; ?>" size="13" maxlength="35"></td>

                               <td><input type="text" name="article[pu][]" value="<?php echo $article[pu][$i]; ?>" size="13" maxlength="35"></td>

                           </tr>
                           
                           <?php      }    ?>
                           
                           <tr>    
                                   <input type="hidden" name="etape" value="<?php echo $etape; ?>">
                     <!--          <td><input type="submit" name="valider" value="Ajouter"></td>     -->
                           </tr>
                           
                           <tr>
                               <td><input type="submit" name="valider" value="Enregistrer"></td>
                           </tr>

                           </form>
                           
</table>



Posté : 15 déc. 2006, 21:56
par Cyrano
Logique : lorsque tu enregistres une première fois, tu ne récupères pas la clé primaire (si tant est qu'il y en ait une)

Ensuite lorsque tu fais une requête UPDATE, la mise à jour sera faite sur toutes les lignes parce que tu n,as mis aucune clause WHERE. or il devrait y avoir cette clause pour mettre à jour le bon élément dans la bonne ligne.

Ce qui veut dire que ton panier devrait avoir un élément supplémentaire vide par défaut contenant la clé primaire à récupérer lors de l'enregistrement.

Est-ce que tu saisis mieux ?

Ceci dit, gérer le panier via la base de données, sans être une mauvaise méthode en soi est un peu plus lourde. il y aurait une autre manière de faire avec des sessions. Voir un tuto disponible sur le sujet.

rep Cyrano

Posté : 15 déc. 2006, 22:31
par piedbleu
Merci Cyrano pour cette réactivité.

Sans clause WHERE la totalité de la table est mise à jour, nan?

-- de Cyrano:
>>Ensuite lorsque tu fais une requête UPDATE, la mise à jour sera faite >>sur toutes les lignes parce que tu n,as mis aucune clause WHERE. or il >>devrait y avoir cette clause pour mettre à jour le bon élément dans la >>bonne ligne.

Alors que si je modifie mes 2 lignes, seule la 2nde est prise en compte et est affectuée à l'ensemble de ma table.

Tu auras sans doute deviné que mon exemple est tiré d'une appli. + complexe, ds laquelle je passe effectivement un identifiant pour présicer le ou les enregistrements à mettre à jour, et le pbm. est le même :(.

Je ne passe pas par les sessions - à tort? - pour des raisons d'utilisation de cette appli., multiutilisateurs et multipostes et y reviendrai éventuellement par la suite.

Ds l'immédiat j'aimerai au moins gérer le bout de code présenté ci - dessus : je l'enrichis d'une clause WHERE et me précipite pour te - Cyrano - et vous - tte autre personne - demander votre avis.

Tte autre remarque bienvenue entre tps !

Sinon mon pseudo ne s'affiche pas et est remplacé par "invité", que faut - il faire?

Re: rep Cyrano

Posté : 16 déc. 2006, 01:12
par Cyrano
...mon exemple est tiré d'une appli. + complexe, ds laquelle je passe effectivement un identifiant pour présicer le ou les enregistrements à mettre à jour, et le pbm. est le même ...
As-tu modifié la requête de mise à jour en conséquence ?

Posté : 16 déc. 2006, 18:31
par piedbleu
Oui mais ça ne roule pas, alors que mon tableau se rempli et se met à jour correctement.

J'ajoute un id ds ma table que je force à 1 et ma clause where porte sur cet id - requête $req2 modifiée.

Après saisies des 2 lignes de mon formulaire, je veux un truc du genre ds ma table:

1 art1 1 11
1 art2 2 22

L'enregistrement est ok, le réaffichage du formulaire est ok.

Lorsque je modifie l'un des 6 champs ou plus parmi art1, 1, 11, art2, 2, 22, le réaffichage du formulaire est ok mais ds ma table figure 2 fois le même enregistrement, celui correspondant à la dernière ligne.

Donc est ce que je peux m'en sortir avec une clause where portant sur un identifiant non unique - valeur 1 ici ?

Tout avis bienvenu, merci.

Posté : 16 déc. 2006, 19:06
par Cyrano
J'ajoute un id ds ma table que je force à 1...
:shock: Pourquoi en forcer la valeur ? ça veut dire que tous les articles ont le même identifiant ? Donc une mise à jour aura lieu sur tous les articles. C'est complètement inutile ça :-k

Posté : 16 déc. 2006, 20:15
par piedbleu
Oui c'est exactement ce que je veux, une mise à jour sur les deux articles dont les références s'affichent ds les deux lignes de mon formulaire: est - ce possible? Dans le cas contraire je revois la structure de mon bidule.

Je précise que je ne gère pas un panier et que j'ai qque chose du genre:


idunique=1 1 art11 1 11
idunique=2 1 art12 2 22
idunique=3 2 art21 1 12
idunique=4 2 art22 2 55

idunique est un chmap auto+.

J'effectue une requête portant sur le 2nd champ et qui m'affiche un formulaire prérempli des enregistrements correspondants.

Si par exemple 2nd champ=1, j'affiche donc 2 lignes de formulaires préremplies des valeurs (art11, 1, 11) d'une part et (art12, 2, 22) d'autre part.

Une modification de l'une de ces valeurs m'enregistre invariablement ds la table la 2nde ligne pour 2nd champ=1.

Je ne vois pas pourquoi ces 2 lignes ne sont pas distinguées lors de l'update ! Alors que je récupère tout bien ds mon tableau.

Je me permet de reposter mon code très légèrement modifié:
initialisation à 1 de $idcommande - pour l'exemple.
modification de la requête ds case 2 => $req2.

Ds le formulaire que je ne poste pas j'ai juste ajouté un champ caché pour faire passer $idcommande.


<?php
                include('include/connexion.php');

                $etape = 0;
                $idcommande = 1;
                
                if (isset($_REQUEST['etape']) & !empty($_REQUEST['etape'])) {

                   $etape = $_REQUEST['etape'];
                }
                
                if (isset($_REQUEST['idcommande']) & !empty($_REQUEST['idcommande'])) {

                   $idcommande = $_REQUEST['idcommande'];
                }

                switch ($etape) {
                                	
                case "0": // saisie formulaire
                         $etape = 1;
                         include('essaiform.php');
                break;
                
                case "1": // enregistrement et affichage pour modifs

                         // test contenu de la variable article postée: OK
                         echo 'contenu de article posté: test ok';
                         echo '<pre>';
                         print_r($_POST["article"]);
                         echo '</pre>';

                         // affectation de la variable postée
                         for($i=0;$i<=1;$i++){
                         $article["nom"] = $_POST["article"]["nom"];
                         $article["qte"] = $_POST["article"]["qte"];
                         $article["pu"] = $_POST["article"]["pu"];
                         }

                         // test contenu de la variable affectée: OK
                         echo 'contenu de article affecté: test ok';
                         echo '<pre>';
                         print_r($article);
                         echo '</pre>';

                         // insertion ds la table: OK
                         for($i=0;$i<=1;$i++){
                         $req1="insert into essaiarticle (idcommande, nom_art, qte, pu )
                         values($idcommande, '{$article[nom][$i]}', '{$article[qte][$i]}', '{$article[pu][$i]}' )";
                
                         $rep1=mysql_query($req1)or die("Enregistrement ds table article impossible");
                         }
                         echo $idcommande;
                         $etape=2;
                         include('essaiform.php');

                break;

                case "2": // maj enregistrement suite modifs de saisie

                         // affectation suite maj
                         for($i=0;$i<=1;$i++){
                         $article["nom"] = $_POST["article"]["nom"];
                         $article["qte"] = $_POST["article"]["qte"];
                         $article["pu"] = $_POST["article"]["pu"];
                         }

                         // ICI PROBLEME: REQUETE NON PRISE EN COMPTE - ARRGHHH !
                         for($i=0;$i<=1;$i++){
                         $req2="UPDATE essaiarticle SET nom_art='{$article[nom][$i]}', qte='{$article[qte][$i]}', pu='{$article[pu][$i]}'
                         WHERE idcommande='$idcommande'";

                         $rep2=mysql_query($req2)or die("MAJ table article impossible");
                         }
                         
                         echo $idcommande;
                         echo 'contenu de article maj: test OK';
                         echo '<pre>';
                         print_r($article);
                         echo '</pre>';

                         include('essaiform.php');
                }
?>




Posté : 17 déc. 2006, 18:11
par piedbleu
Bien, je devrais m'en sortir en faisant porter la clause where sur un id unique .... hum, effectivement!

Merci pour les contributions.

Posté : 17 déc. 2006, 18:16
par piedbleu
Ayant posté mon premier message en tant qu'invité, je ne peux pas le marquer " RESOLU ": il l'est.

Posté : 17 déc. 2006, 18:22
par Cyrano
ok, taggué.