Partage
  • Partager sur Facebook
  • Partager sur Twitter

header location avec variable

Sujet résolu
    2 décembre 2020 à 19:12:25

    Bonjour, bonsoir

    Je n'arrive pas à écrire l'url de redirection ci-dessous malgré de multiples essais...

    Le problème étant au niveau de la variable "nfamille" qui est le nom de chaque famille inscrite dans la table "log_famille"

    Pourriez-vous me mettre sur la piste de l'erreur ?

    Merci d'avance

    <?php
       session_start();
       $nfamille=$_POST["nfamille"];
       $login=$_POST["login"];
       $pass=$_POST["pass"];
       $valider=$_POST["valider"];
       $erreur="";
       if(isset($valider)){
          include("connexion.php");
          $sel=$pdo->prepare("select * from log_fam where login=? and pass=? limit 1");
          $sel->execute(array($login,$pass));
          $tab=$sel->fetchAll();
          if(count($tab)>0){
             $_SESSION["prenomnom"]=ucfirst(strtolower($tab[0]["prenom"])).
             " ".strtoupper($tab[0]["nom"]);
             $_SESSION["autoriser"]="oui";
    header("Location: http://monsite.fr/familles/$nfamille/session_familles.php"); 
          }
          else
             $erreur="Mauvais login ou mot de passe!";
       }
    ?>
    <!DOCTYPE html>   
    <html>
    ICI formulaire de connexion - login et pass
    </html>



    • Partager sur Facebook
    • Partager sur Twitter
      2 décembre 2020 à 19:24:54

      Bonjour,

      header("Location: http://monsite.fr/familles/".$nfamille."/session_familles.php");

       Serait mieux.



      -
      Edité par Fecal-Matter 2 décembre 2020 à 19:25:23

      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2020 à 19:37:44

        Ca ne changera rien, ça revient au même : avec les " les variables sont interpolées (remplacées par leur valeur) et le / ne peut pas figurer en nom d'une variable.

        Le problème vient de la variable $_POST["nfamille"] ? (elle n'existe pas ?)

        Tu obtiens quoi ? var_dump($_POST); ?

        • mots de passe en clair, sans commentaire
        • fetchAll pour au plus une ligne c'est un peu overkill mais pourquoi pas (je veux dire ce n'est pas le pire)
        • idem, le LIMIT 1, normalement, n'est pas nécessaire (j'espère qu'il y a une contrainte unique sur login surtout)
        • ucfirst/strtolower/strtoupper sont incompatibles avec de l'UTF-8 (surtout ucfirst !)
        • au lieu d'utiliser les chaînes "oui"/"non", il existe le type booléen
        • tester l'existence des variables (ligne 8) c'est bien, sauf qu'il faut le faire avant de l'utiliser (ligne 6) sinon ça sert un peu à rien
        • et tant qu'à faire, on les teste toutes, pas juste une

        Bon, au moins, pour une fois, il n'y a pas d'injection SQL

        -
        Edité par julp 2 décembre 2020 à 19:44:57

        • Partager sur Facebook
        • Partager sur Twitter
          3 décembre 2020 à 8:59:33

          Merci julp pour ton retour.

          problème j'ai du mal à comprendre le fonctionnement de php et donc je tatonne avec des exemples pris ici ou là.

          Ce qui explique toutes ces incohérences. Désolé. Mais j'essaie quand même d'avancer... Alors si je fais:

          else
                   $erreur="Mauvais login ou mot de passe!";
             }
          var_dump($_POST);
          ?>

          array(0) { }  s'affiche.

          La variable "nfamille" semble ne pas exister.... mais pourquoi ?

          Faut-il mettre le test if(isset ()) avant session-start () ?

          avec toutes les variables (login et pass compris ?)

          Merci pour tes conseils.

          • Partager sur Facebook
          • Partager sur Twitter
            3 décembre 2020 à 11:32:29

            > La variable "nfamille" semble ne pas exister.... mais pourquoi ?

            Après avoir soumis le formulaire ? (pas avant) On pourrait avoir le code de ce formulaire ?

            > Faut-il mettre le test if(isset ()) avant session-start () ?

            Pas nécessairement mais tu pourrais, semble-t-il, ici.

            > avec toutes les variables (login et pass compris ?)

            C'est toujours mieux de s'assurer que ce qu'on utilise existe au préalable puisque les variables superglobales $_COOKIE, $_POST, $_GET, etc dépendent de ce que l'utilisateur (si encore le client est humain et non un bot quelconque) envoie (et veut bien nous envoyer/jouer le jeu).

            -
            Edité par julp 3 décembre 2020 à 11:33:10

            • Partager sur Facebook
            • Partager sur Twitter
              3 décembre 2020 à 13:32:04

              Voici le fichier complet d'origine.

              La variable NOM FAMILLE -  $nfamille n'est donc pas déclarée correctement...

              Faut-il faire 2 fichiers : un pour le lancement de la session avec le formulaire de connexion et un autre qui redirigera vers le dossier NOM FAMILLE ?

              <?php
                 session_start();
                 $nfamille=$_POST["nfamille"];
                 $nom=$_POST["nom"];
                 $prenom=$_POST["prenom"];
                 $login=$_POST["login"];
                 $pass=$_POST["pass"];
                 $valider=$_POST["valider"];
                 $erreur="";
                 if(isset($valider)){
                    include("connexion.php");
                    $sel=$pdo->prepare("select * from log_fam where login=? and pass=? limit 1");
                    $sel->execute(array($login,$pass));
                    $tab=$sel->fetchAll();
                    if(count($tab)>0){
                       $_SESSION["prenomnom"]=ucfirst(strtolower($tab[0]["prenom"])).
                       " ".strtoupper($tab[0]["nom"]);
                       $_SESSION["autoriser"]="oui";
              header("Location: http://monsite.fr/familles/NOM FAMILLE/session_familles.php"); 
                    }
                    else
                       $erreur="Mauvais login ou mot de passe!";
                 }
              ?>
              <!DOCTYPE html>   
              <html>
                 <head>
              		<meta charset="utf-8" />
                    
                 </head>
                 <body>
                  
              <div align="center">
              
              <table>
              <tr><th>
              	  <h2 style="color:#ee2c7f;">Connexion "Familles"</h2> 
                    <div class="erreur"><?php echo $erreur ?></div>
              </th></tr>
              <tr><th>
              
              	<table class="table-form-fam">	
              	<tr><th>
                    <form name="fo" method="post" action="">	  
                       <input class="input-login" type="text" name="login" placeholder="Login" /><br /><br />
                       <input class="input-login" type="password" name="pass" placeholder="Mot de passe" /><br />
                       <input class="input-login" type="submit" name="valider" value="Se Connecter" />		 
                    </form>		  
              	 </th></tr>
              	 
              	 </table>
              </th></tr>	 
              </table>
              </div>
              	 
              </body>
              </html>



              • Partager sur Facebook
              • Partager sur Twitter
                3 décembre 2020 à 13:58:54

                Euh, tu n'as pas de champ pour demander nfamille, nom et prenom donc ces variables POST sont censées provenir de quoi et d'où ?!?

                Si c'est bien un formulaire de connexion, il me paraîtrait logique que ces informations proviennent de la base de données, non ? Parce que tu ne vas pas les redemander à chaque connexion, si ?

                -
                Edité par julp 3 décembre 2020 à 14:10:01

                • Partager sur Facebook
                • Partager sur Twitter
                  4 décembre 2020 à 9:16:58

                  OK ! donc tout faux, rien compris...

                  Désolé de t'avoir fait perdre ton temps.

                  Mon besoin est pourtant simple sur le papier: une table avec mes 5 variables, un formulaire de connexion avec login et pass et une redirection vers un dossier Nom de Famille en récupérant $nfamille.

                  Bon je vais essayer de repenser l'écriture. 

                  Par contre peux-tu juste me dire si il est possible et comment écrire un header location avec une variable de ma table comme pour ma demande initiale ?

                  Merci encore.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 décembre 2020 à 11:17:10

                    Bonjour,

                    Hervé 44 a écrit:

                    Par contre peux-tu juste me dire si il est possible et comment écrire un header location avec une variable de ma table comme pour ma demande initiale ?

                    utilise la fonction urlencode , mais attention cette dernière a une faille de sécurité pour des entités HTML, comme &amp;, &copy; et &pound;, qui sont analysées par le client web et remplacées par leur valeur. C'est un vrai problème qui a été montré par le W3C depuis longtemps. La référence est ici : » http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2

                    alors pour pallier à ce problème il sera mieux d'avoir une fonction qui élimine et transforme les caractères spéciaux ou les entités HTML en d'autre caractères alphanumériques, alors tu pourras avoir quelque chose du style:

                    <?php
                    
                      header("Location: chemin_du_fichier.php/". urlencode( ta_fonction($taVariable)) );
                    
                    ?>




                    -
                    Edité par EL-jos 4 décembre 2020 à 11:18:34

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Ton présent détermine ton futur et la connaissance te placera au dessus de ta génération .

                      4 décembre 2020 à 11:30:46

                      > Mon besoin est pourtant simple sur le papier: une table avec mes 5 variables, un formulaire de connexion avec login et pass et une redirection vers un dossier Nom de Famille en récupérant $nfamille.

                      Oui sauf que ce n'est pas ce que tu as écrit (code) : tu as des variables qui supposent provenir du formulaire et non de ta table.

                      > Par contre peux-tu juste me dire si il est possible et comment écrire un header location avec une variable de ma table comme pour ma demande initiale ?

                      Absolument. Par contre il est vrai qu'il faudrait un urlencode mais à savoir :

                      • il faudra penser à protéger l'accès à cette page parce que si je tape moi-même l'adresse et que je consulte les données de quelqu'un d'autre, ce n'est pas terrible
                      • utiliser peut être autre chose que le nom de famille : quid d'un homonyme ?

                      Mais, as-tu vraiment besoin de faire figurer cette information dans l'URL plutôt que de la mettre en session (et utiliser celle-ci) ?

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 décembre 2020 à 9:37:39

                        Merci à tous les deux

                        Compliqué compte tenu de mes (in)compétences.

                        @julp: en fait mon projet est de faire un genre de messagerie privée et je souhaitais donc créer des dossiers par familles car j'ai (j'aurai) plusieurs fichiers à y mettre (image, pdf, php, doc...).

                        Et cela me semblait le plus simple.

                        Avec les sessions je ne vois pas trop comment y arriver.

                        Bon je vais reprendre le projet à zéro en essayant de mieux comprendre (!!) le fonctionnement de php.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 décembre 2020 à 19:28:12

                          Bonjour,

                          Bon je pense avoir bien repris le fil de mon projet en utilisant les sessions.

                          Ya encore du pain sur la planche mais je ne désespère pas...

                          Et sûrement d'autres questions à venir...

                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 décembre 2020 à 22:52:12

                            bonsoir OP,

                            Je suis le seul que ca fait saigner des yeux

                            $_SESSION["autoriser"]="oui";

                            tu pourrai mettre

                            $_SESSION["autoriser"]=true;

                            C'est du booleen si tu ne connais pas Op cela te permettrai entre autre de faire

                            <?php
                            if($_SESSION["autoriser"])      '
                              //ton code
                            }





                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 décembre 2020 à 23:27:38

                              > Je suis le seul que ça fait saigner des yeux

                              Je l'ai relevé lors de mon premier post :

                              > au lieu d'utiliser les chaînes "oui"/"non", il existe le type booléen

                              Mais de toute façon cette variable de session vaudra "oui" (ou vaudrait TRUE) sinon ne serait pas définie. En conséquence, c'est avant tout un isset qu'il faudrait (aurait fallu ?) pour la tester. Du moins sans avoir une initialisation explicite à FALSE (ou autre $_SESSION["autoriser"] ?? FALSE) qui ne nous a pas été montrée.

                              -
                              Edité par julp 11 décembre 2020 à 23:36:11

                              • Partager sur Facebook
                              • Partager sur Twitter

                              header location avec variable

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown