Formulaire et tableau : maj table

Invité
Invité n'ayant pas de compte PHPfrance

15 déc. 2006, 21:43

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>



Mammouth du PHP | 19672 Messages

15 déc. 2006, 21:56

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

15 déc. 2006, 22:31

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?

Mammouth du PHP | 19672 Messages

16 déc. 2006, 01:12

...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 ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

16 déc. 2006, 18:31

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.

Mammouth du PHP | 19672 Messages

16 déc. 2006, 19:06

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
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 8 Messages

16 déc. 2006, 20:15

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');
                }
?>




Petit nouveau ! | 8 Messages

17 déc. 2006, 18:11

Bien, je devrais m'en sortir en faisant porter la clause where sur un id unique .... hum, effectivement!

Merci pour les contributions.

Petit nouveau ! | 8 Messages

17 déc. 2006, 18:16

Ayant posté mon premier message en tant qu'invité, je ne peux pas le marquer " RESOLU ": il l'est.

Mammouth du PHP | 19672 Messages

17 déc. 2006, 18:22

ok, taggué.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: