Lea Posté 17 Août 2004 Posté 17 Août 2004 Bonjour, Voilà mon problème : J'ai créé un formulaire pour récupérer des infomations relatives à mes clients dans une base de données. Ce formulaire était très long donc je l'ai coupé en 2 parties (sur 2 pages différentes). Pour la première partie tout va bien, les infos passent bien dans la base, mais comment faire pour que lorsque les personnes atteignent la seconde page du formulaire, les informations entrées aillent bien dans les cases correspondant au bon ID et qu'une nouvelle ligne ne soit pas créée. Je pense qu'il faut peut être utiliser les sessions mais je ne sais pas comment. Je ne sais pas si je suis claire mais je débute en Php. Merci beaucoup pour votre aide, les hubmasters...
Anonymus Posté 17 Août 2004 Posté 17 Août 2004 Effectivement, le mieux est d'utiliser les sessions. Ce n'est pas compliqué à comprendre, et c'est assez puissant. Lorsque l'internaute valide la première page, tu entres les données dans la base, et tu extrait le dernier ID entré. Ensuite, tu passes cet ID à la seconde page, et tu t'occupes du second formulaire. Anonymus.
Lea Posté 17 Août 2004 Auteur Posté 17 Août 2004 Merci Anonymus pour ta réponse, Pourrais tu me donner un exemple de code pour créer une session ou bien me dire ou je peux en trouver sur le net. Léa
Anonymus Posté 17 Août 2004 Posté 17 Août 2004 Avec 2 pages, ca donne ceci : page session_1.php <?session_start();if(!isset($a))$a=0;echo"a = ".$a;session_register("a");echo"<br><a href=\"session_2.php\">aller à la page 2</a>";?> page session_2.php <?session_start();$a++;echo"On ajoute 1 à la variable a";session_register("a");echo"<br><a href=\"session_1.php\">aller à la page 1</a>";?> N'hésites pas, si tu as une autre question
Ganf Posté 17 Août 2004 Posté 17 Août 2004 L'histoire des sessions c'est bien et ça marche mais ce n'est pas parfait. Avec l'arrivée des nouveaux navigateurs de plus en plus de gens naviguent avec plusieurs fenêtres/tab ouverts sur le même site. Je ne parle pas que des informaticiens mais aussi de monsieur tout le monde. Le problème survient dans ton cas quand la personne rempli un même formulaire dans deux fenêtres différentes (ou deux formulaires qui utilisent une même var de session). Imaginons le scénario suivant qui demande de choisir un pays dans la première partie du formulaire et un visiteur qui utilise deux fenetres, A et B : - fenetre A : remplie avec le pays "allemagne" et on envoie (ça écrit "allemagne" dans la session) - fenetre B : remplie avec le pays "canada" et on envoie (ça écrit "canada" dans la session) - fenetre A : on remplit la seconde partie et on envoie => vu que la session contient maintenant "canada" il se retrouvera avec un résultat qui ne correspond pas à ce qu'il a envoyé dans la fenetre A mais à ce qu'il a envoyé dans la fenetre B Effectivement suivant les formulaire on peut dire qu'il est idiot/inutile de faire deux fois le formulaire simultanément. Mais en même temps l'utilisateur peut avoir envie de tester, ou avoir besoin de faire quelque chose de non prévu. Il a même le droit d'être idiot ou de faire un truc inutile sans s'en rendre compte (malheureusement il ne se rendra pas forcément compte que le résultat ne correspond pas à ce qu'il devrait avoir et que ton système de session a tout mélangé). Coté paliatifs on a : - au lieu de tout stocker en session on rajoute tout en champs cachés dans la seconde partie du formulaire. C'est à mon avis la meilleure solution mais il ne faut pas oublier de revérifier la cohérence de ces données lors de la soumission de la seconde partie : il serait simple pour un informaticien ou un utilisateur averti de modifier ce qui est dans les champs cachés. Tant qu'il y a une vérification de toutes les données à chaque fois (et ne jamais considérer qu'une donnée a déjà été vérifiée), il n'y a pas problème. - lors de la visualisation de la première partie on tire un identifiant aléatoire et on le rajoute en champ caché, on remet ce même identifiant dans les parties suivantes du formulaire (toujours en champ caché) et on stockes les données en session dans une variable tableau qui a le nom de cet identifiant. Si la personne utilise deux fenetres, chacune aura son identifiant et les données n'interféreront pas. Ca ne règle pas tous les problèmes (notament ceux d'éventuels retours arrière ou de duplication de fenêtre), mais ça règle le principal
Lea Posté 17 Août 2004 Auteur Posté 17 Août 2004 Pour mon formulaire en 2 parties, j'ai fait un truc du genre : Sur la première page : <?php require_once('../Connections/portail.php'); ?><? $today = date("Y-m-d");$URL="inscription-suite.php";?><? if ($inscrip1 == "ok"){if ($pays_demandeur == ""){$BAD1="ok";}else {mysql_select_db($database_portail, $portail); $insertEchange = "INSERT INTO echange (pays_demandeur) VALUES ('$pays_demandeur')";mysql_query($insertEchange, $portail) or die(mysql_error()); header("location: $URL");}}?><? session_start();$_SESSION["InscripID"]="ID";?> Et sur la seconde : <? $URL="inscription-recapitulatif.php";$ID= $_SESSION["InscripID"];?><? if ($inscrip2 == "ok"){if ($date1== ""){$BAD1="ok";}else {mysql_select_db($database_portail, $portail);$updateEchange = "UPDATE echange SET date_souhaitee_1='$date1' WHERE ID='$ID'";mysql_query($updateEchange, $portail) or die(mysql_error()); header("location: $URL");}}?> Et ça ne marche pas?? Vois tu ce qui cloche? Merci pour tout Léa
Anonymus Posté 17 Août 2004 Posté 17 Août 2004 Je suis un peu d'accord avec toi, Ganf, mais expliquer comment faire... autant le faire directement.. Je veux dire par là : Je donnes bien souvent des solutions qui un compromis entre 'facile' et 'bien'. Ce n'est pas forcément 'très bien', mais c'est 'réalisable'.. par un 'non initié'. Lea : Pour utiliser les sessions, il ne faut pas que tu envoies quoi que ce soit avant de déclarer 'session_start'. Donc, suivant le code que tu donnes, ca ne peut marcher, parce qu'il y a une ligne blanche avant le tag <? sur les 2 fichiers. D'une manière générale, pour le fichier 1, tu devrais mettre ton 'session_start' tout en haut du fichier, et non au milieu. Tu n'as pas besoin de mettre des fins de tag suivis de débuts de tag. Ainsi, ceci est inutile ?><? Ca reviendrait à mettre <b>important</b><b>important aussi</b> Tu conviendras que le </b><b> est inaproprié. Tu devrais utiliser session_register("variable"); pour enregistrer une variable. Le $_SESSION permet de récupérer une variable, pas forcément de l'enregistrer. Sinon, attention à ne pas te mélanger les pinceaux avec les majuscules/minuscules dans les noms de variables, les noms de fichiers, les noms de répertoires. Autant de noms qui sont sensibles à la casse ! Anonymus.
Ganf Posté 17 Août 2004 Posté 17 Août 2004 _AT_Anonymus: oui oui, je suis d'accord, je ne critique pas. La session est probablement ce qu'il y a de plus simple. J'ai juste voulu être un peu plus complet. Si Lea a connaissance des défauts et accepte de s'en contenter (on n'a pas forcément le temps de faire un truc parfait partout) c'est tout à fait correct. J'ai voulu appuyer la dessus en haut de mon message justement pour ne pas lancer forcément tout le monde dans un truc complexe. Désolé si je n'ai pas été clair. Par contre, et là ce n'est pas un point de détail, si vous avez PHP 4.3.x, n'utilisez pas session_register(), vous risqueriez des problèmes. Sur deux config totalement distinctes on a vu quelques problèmes majeurs (sessions corrompues) en utilisant les session_register. Les problèmes ont disparus avec un remplacement automatique de "session_register('xxx') ; " par "$_SESSION['xxx'] = $xxx ; " dans tout le code. Je ne comprend d'ailleurs pas ton argument, $_SESSION est *toujours* accessible en écriture pour peu qu'on ai fait un session_start, et son contenu est toujours sauvegardé (avec la même condition). L'avantage de $_SESSION est d'ailleurs qu'on peut aussi écrire des variables non globales. De mon point de vue comme en plus c'est plus simple/naturel (une simple affectation), autant en profiter.
Lea Posté 18 Août 2004 Auteur Posté 18 Août 2004 Merci beaucoup Anonymus, je vais essayer d'appliquer tes recommandations
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant