Stocker une variable dans l'url

Bonsoir tous le monde,

Je suis en train d'améliorer un script, et j'ai besoin d'un conseil.
Dans une page d'inscription je transite mes messages d'erreurs dans l'URL. (je précise qu'il y a deux fichiers, 1 qui fait les vérifications, et un autre qui affiche le formulaire et les erreurs s'il y en a)

Dans mon fichier PHP j'ai donc ceci:
<?php
//...Variables....

if(empty($log_pseudo) OR empty($log_pass)) {
header('Location: monsite/register.php?erreur_message=Tous les champs....');
}

//.......Puis d'autre vérification avec chacune leur redirection et un message d'erreur différent(email non valide...) basé sur le même modèle que ci-dessus.
?>

Avez-vous des idées d'améliorations ? Comment faites-vous habituellement ?

22 réponses

Résumé de la discussion

Transmission des erreurs dans l'URL lors d'une inscription en PHP constitue la problématique centrale, avec séparation entre le fichier de vérification et celui qui affiche le formulaire. Plusieurs répondants proposent d'utiliser un fichier de paramètres et un tableau d'erreurs, puis de transmettre un identifiant (num_err) dans l'URL et d'afficher le contenu correspondant côté formulaire. D'autres évoquent l'usage des sessions pour mémoriser l'erreur entre les pages, avec des conseils sur session_destroy, les multi-sessions et la gestion de variables, ou sur une approche combinant error_id et affichage conditionnel. En pratique, certaines propositions visent à optimiser sécurité et extensibilité en évitant d'exposer le contenu complet dans l'URL et en privilégiant des identifiants d'erreur ou des variables de session consultables côté serveur.

Bobot (l’IA à votre service)
  1. C'est bon j'ai trouvé le problème. Il fallait gérer l'affichage de l'erreur avec le isset du côté html.

    Merci à tous...
    1. Pour ne pas partir dans du compliqué je vais faire un include, et gérer donc les données directement dans ma page login. Tous fonctionne parfaitement mis à part un petit point.
      Pour ne pas afficher un message d'erreur dès que le membre arrive sur la page je vérifie que le formulaire a été envoyé (et qu'il n'est pas vide).

      //On verifie que tous les champs sont remplies
      if(isset($submit_log) AND empty($log_email) OR empty($log_pass)) {
      $erreur_message = 'Tous les champs doivent être remplie.';
      }

      Mais ça ne marche pas, si j'arrive sur la page home, puis je vais sur ma page de login il m'affiche directement l'erreur.

      en tous cas merci pour vos aides qui me sont bien précieuses.
      1. il suffit de "charger" la variable de session correspondant à user_name que si pas d'erreur sur ce champ, donc c'est bien qu'il aura déja saisi qq chose non ?
        et si ce champ est ok je ne vois pas pourquoi ensuite ça donnerait une erreur, et comment sans passer par le formulaire tu puisses atteindre la page login ?

        sinon pour revenir a ta solution via l'url:

        est ce que $log_name = $_POST['log_name'];

        est bien avant la ligne header('Location: monsite/log?user_name ='.$log_name);
        et tu as bien un input dont le name="log_name" ?
        ou name="user_name" ?
        1. Mais y a t-il un moyen de faire passer une variable avec GET. Quelque chose comme ça par exemple :

          log?user_name=$log_pseudo

          Ça m'éviterais de gérer plusieurs possibilités , et le script chargera plus vite.

          En tout cas merci pour l'aide que tu m'apportes.
          1. tu peux rediriger avec la chaine que tu souhaite.

            Par exemple si tu as fais un

            <a href="/index.php?gerererr=<?php echo $var; ?>"


            avec par exemple var =1 , lors de la lecture, si ton paramètre gerererr est à un, tu vérifies les erreurs dans ton tableau session, sinon non

            J'ai un doute sur <?php echo $var; ?> ... je crois que le echo n'est pas necessaire mais je suis pas sur.
          2. si echo est nécessaire
            ou un raccourci
            <?=$var ?>
          3. ok merci pour l'info =) (ca fait qq temps que j'ai pas tappé dans le php =p)
          4. Dsl, je vient juste de voir cette conversation. Le include me simplifie la vie et me permet ainsi de réduire drastiquement mon code. Je part finalement là dessus. Merci pour ton aide nagashima
          5. pas de soucis bonne continuation =)
        2. ce sont des exceptions à gérer de toi même, vu que tu connais la cause et l'effet, il te suffit maintenant de trouver le 'subterfuge' adéquate ^^
          1. comme par exemple indiquer quelle était la page précédente, associer des identifiants à tes erreurs, etc.
            .
        3. En effet ça marche, mais ce n'est pas optimal. Par exemple, si le membre va sur la page de login, il fait une erreur, il déclenche donc le système de session, puis il retourne sur la page home, puis il revient sur la page de login (c'est vrai que c'est farfelu, mais c'est possible). Resultat il va voir un message d'erreur alors qu'il n'a encore rien envoyé par le formulaire.
          1. Peux t-on activer plusieurs session pour un même site ?
            Oui et non
            En fait tu actives une session par utilisateur qui reste active tant qu'il n'a pas fermé son navigateur ou au bout d'un certain temps d'inactivité.
            Donc sur ton serveur à un moment donné tu vas avoir plusieurs sessions si plusieurs utilisateurs connectés, mais elles se différencient par un ID de session (SSID) spécifique à chacun, stocké dans un cookie chez l'utilisateur.

            par contre tu peux faire autant de variables de session que tu veux
            $_SESSION['var1']
            $_SESSION['var2']
            etc...
            même a plusieurs niveaux
            $_SESSION['type1']['var1']
            $_SESSION['type1']['var2']
            $_SESSION['type2']['var1']
            $_SESSION['type2']['var2']

            Mais si je pars dans une session, il faudra bien que je fasse session_destroy dans ma page avec le formulaire non ?

            NON surtout pas puisque c'est tout l'intérêt de pouvoir justement récupérer la valeur si la variable de session existe if(isset(....

            par contre si tu n'en a plus besoin dans les pages suivantes tu peux faire session_destroy , si tout ok a la fin de la page verif
            1. je ne crois pas que tu puisse gérer plusieurs $_SESSION, par contre tu peux facilement créer une valeur dans ton tableau session
              par exmple tu feras
              $_SESSION['MonErreur'] = ta chaine d'erreur

              lors du post

              puis tu récupèrera la valeur dans ta nouvelle page
              $err = $_SESSION['MonErreur'] 


              il te suffira ensuite mettre à null cette valeur pour que l'erreur ne réapparaisse pas dans les autres pages (car faire un destroy de la session t'empêchera de justement gérer la session de ton utilisateur).
              1. @Alain_42,

                Non justement. Je vois rien : user_name =(il n y a rien après).
                Et si je fait ça :

                log?user_name=$log_pseudo') (donc avec le guillemet après pseudo) il m'affiche user_name=$log_pseudo.

                En fait il n'execute pas le code.
                1. est ce que $log_name = $_POST['log_name'];

                  est bien avant la ligne header('Location: monsite/log?user_name ='.$log_name);
                  et tu as bien un input dont le name="log_name" ?
                  ou name="user_name" ?
              2. Mais si je pars dans une session, il faudra bien que je fasse session_destroy dans ma page avec le formulaire non ?

                Peux t-on activer plusieurs session pour un même site ? Cela ne pose-t-il pas de problème ?

                Merci pour ton avis nagashima.
                1. est ce que dans la barre d'adresse tu vois bien
                  ....log?user_name = le_pseudo_tapé
                  1. plus simplement, rajouter un valeur dans $_SESSION me semble le plus simple et le moins visible.
                    1. Merci d'avoir répondu si vite,

                      Pour ne pas avoir de problème avec certaine de mes pages, je ne préfère pas utiliser de session. Je vais donc rester sur le GET.

                      En revanche comment fais-tu pour passer une variable dans l'url, puisque

                      log?user_name = ' . $log_name ne marche pas.
                      À savoir que $log_name = $_POST['log_name']
                      1. ha ok je pensait que tu avait le form et la verif dans la même page

                        L'avantage de tout mettre dans la même page c'est que tu peux facilement ré afficher la valeur déjà saisie en utilisant la méthode que je viens de te donner
                        Il suffit de faire la verif en début de page avant le form
                        par un
                         if(isset($_POST['name_du_bt_submit']{  
                          //tes verifs  
                        
                        
                         //si tout bon tu fait un header vers la page suivante de ton site  
                        
                        //si erreurs le formulaire sera réaffiché avec les valeurs déjà saisies  
                        //et les messages éventuels  
                        }


                        par contre si dans des pages différentes, tu peux faire du POST du formulaire vers la pge verif ,mais de verif => form c'est du GET par l'URL

                        ou passer par les variables de session php
                        //dans la page du formulaire  
                        <?php  
                        session_start();  
                        if(isset($_SESSION['user_name'])){  
                           $user_name=$_SESSION['user_name'];  
                        }else{  
                            $user_name=""  
                        }  
                        
                        //idem pour les autres champs
                        //puis dans le formulaire:  
                        <form name="form1" method="post" action="" >  
                        <input type="text" name="user_name" value="<?php echo $user_name; ? />  
                        


                        dans ta page verif
                        <?php  
                        session_start();  
                        if(isset($_POST['user_name'])){     
                           $user_name=htmlspecialchars($_POST['user_name']); 
                          //tu fais tes verifs   
                        
                          //puis on charge la variable de session  
                          $_SESSION['user_name']=$user_name;  
                        }
                        
                        //idem pour les autres champs
                        
                        1. Merci Alain_42 pour ta réponse,

                          Le problème c'est que le formulaire ne se trouve pas dans la même page, que celle où se passe les vérifications. Je n'ai donc pas trouvé d'autres moyen que de passer par l'URL en faisant comme ceci :

                          if(un problème) {
                          header('Location: monsite/log?user_name = ?');
                          }

                          Je redirige donc vers ma page ou se trouve le formulaire avec des infos dans l'URL. Puis je les reprends avec GET.

                          Mais il y a également un problème ou je coince. Comment reprendre le pseudo que l'utilisateur à marqué. Si je fait ça, cela ne marche pas:

                          he....(.....log/?user_name = ' . $log_pseudo)

                          Y a-t-il la possibilité d'utiliser POST plusieurs fois ? C'est à dire, de la page du form vers la page de vérif, puis de la page de vérif vers la page du form, sachant que je suis obligé de renvoyer le membre vers la page du formulaire avec un header.

                          Merci pour ton aide
                          1. je ne comprend pas tu dis:
                            Mais comment faits-tu ? Puisqu'il n'y aura pas de formulaire avec la méthode POST

                            et plus bas:
                            Je voudrais simplement lors du chargement de la page en cas d'erreur marqué le pseudo dans le champ dédié pour éviter à l'utilisateur de le réécrire une nouvelle fois.

                            Dans mon formulaire j'ai fait ça :
                            value="<?php echo htmlspecialchars($_GET['user_name']); ?>


                            donc tu as bien un formulaire.

                            tu peux faire ré-afficher tous les champs que tu veux en cas d'erreur il suffit de faire ceci:

                            <?php
                            //récup valeur si champ déja posté, sinon vide
                            if(isset($_POST['user_name'])){
                            $user_name=htmlspecialchars($_POST['user_name']);
                            }else{
                            $user_name="";
                            }
                            
                            //idem pour tous tes champs
                            ?>
                            //puis dans le formulaire:
                            <form name="form1" method="post" action="" >
                            <input type="text" name="user_name" value="<?php echo $user_name; ? />
                            etc...
                            
                            1. J'ai une autre question. Comment faire transiter le pseudo marqué dans un champ.
                              Si je fait http://......?user_name=$user_name ça ne marche pas.

                              Je voudrais simplement lors du chargement de la page en cas d'erreur marqué le pseudo dans le champ dédié pour éviter à l'utilisateur de le réécrire une nouvelle fois.

                              Dans mon formulaire j'ai fait ça :
                              value="<?php echo htmlspecialchars($_GET['user_name']); ?>
                              1. Merci doguo02 pour ta réponse,

                                Mais comment faits-tu ? Puisqu'il n'y aura pas de formulaire avec la méthode POST

                                Afficher uniquement un message d'erreur par l'URL risque-t-il de poser des problèmes de sécurité ?
                                Si la personne qui s'amuse à trafiquer l'URL met des chaines de caractères trop importantes je crois que la mémoire de son ordinateur va consommer énormément pour stocker tous les messages... Mais cela risque-t-il d'impacter également mon serveur ?

                                J'ai rapidement regarder le code source de Twitter et Facebook. Apparement pour afficher le pseudo dans les champs en cas d'erreurs, ils transitent les infos par l'URL (get)
                                Ex sur twitter : https://twitter.com/login/error?username_or_email=fzfef
                                1. tu fais un fichier parametres.inc.php
                                  dans lequel tu mets:
                                  <?php
                                  //array des messages d'erreur
                                  $array_msg_err=array("1"=>"Tous les champs doivent être remplis","2"=>"Erreur pseudo","3"=>"Erreur mpd"); etc...
                                  ?>
                                  


                                  au début de tes pages php tu mets
                                  <?php
                                  include('parametres.inc.php');
                                  ?>


                                  tu transmets dans l'url ainsi:
                                  header('Location: monsite/register.php?num_err=1'); //ou 2 ou 3 etc...
                                  


                                  et pour afficher l'erreur dans register.php:

                                  if(isset($_GET'num_err'])) && (is_int($_GET'num_err'])){
                                      //on verifie que c'est bien un nombre (sécurité !)
                                     $num_err=$_GET'num_err;
                                  //affichage message erreur
                                  echo $array_msg_err[$num_err];
                                  }
                                  
                                  1. Je te conseillerais de passer tes variables en post plutôt qu'en Get,ca évitera que de petit malin modifie l'url
                                    • 1
                                    • 2