Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme avec Header Location - Redirection

    15 octobre 2020 à 7:09:01

    Bonjour à tous.

    Je suis un jeune débutant, et je rencontre quelques soucis.

    Je viens de finir mon site mail envoyé avec inscription doit rediriger l'utilisateur sur une page de remerciement. Le mail part mais la page n'est pas redirigé avec mon header location.

    Quelqu'un peu m'aider svp ?

    <?php
    if(isset($_POST['forminscription'])) {
       $nom = htmlspecialchars($_POST['nom']);
       $prenom = htmlspecialchars($_POST['prenom']);
       $rue = htmlspecialchars($_POST['rue']);
       $ville = htmlspecialchars($_POST['ville']);
       $codepostal = htmlspecialchars($_POST['codepostal']);
       $email = htmlspecialchars($_POST['email']);
       $telephone = htmlspecialchars($_POST['telephone']);
       $pays = htmlspecialchars($_POST['pays']);
       
      }
      else
      {
      $nom = $_POST['nom'];
      $prenom = $_POST['prenom'];
      $pays = $_POST['pays'];
      $tel = $_POST['tel'];
      $email = $_POST['email'];
      $logo = "";
      $site_email = "123456@gmail.com";
      }
       if(!empty($_POST['nom']) AND !empty($_POST['prenom']) AND !empty($_POST['rue']) AND !empty($_POST['ville']) AND !empty($_POST['codepostal']) AND !empty($_POST['email']) AND !empty($_POST['telephone']) AND !empty($_POST['pays'])) {
                     
                         $q=$db ->prepare("INSERT INTO paiement(nom, prenom, rue, ville, codepostal, email, telephone, pays) VALUES('$nom', '$prenom', '$rue', '$ville', '$codepostal', '$email', '$telephone', '$pays')");
                         $q->execute(array($nom, $prenom, $rue, $ville, $codepostal, $email, $telephone, $pays, $key));
                
              $message = '123456@gmail.com';
    
              $message = "<html><head><title>".$site_email."</title></head>
              <body>
              Nom : ".$nom."<br />
              Nom : ".$prenom."<br />
              Email : " .$email."<br />
              Pays : " .$pays."<br />
              Tél : " .$telephone."<br />
              </body></html>";
                         $header="MIME-Version: 1.0\r\n";
                         $header.='Content-Type:text/html; charset="uft-8"'."\n";
                         $header.='Content-Transfer-Encoding: 8bit';
                         $header.= 'From: '.$nom.' <'.$email.'>'."\r\n";
                         $header.= 'Reply-To: '.$email.  "\r\n";
                          $message='
                         <html>
                            <body>
                            Cliquez sur le lien ci-dessous pour confirmer votre inscription et activer votre compte personnel:
                            <br />
                               <div align="center">
                                <a href="http://localhost/3193/confirme.php?nom'.urldecode($nom).'&key'.$key.'">Confirmer mon compte !</a>
                                <br />
                                <br />
                                Merci de votre confiance et à très bientôt,
                                <br />
    PS: Ceci est un email automatique, merci de ne pas y répondre.
                               </div>
                            </body>
                         </html>
                         ';
                        mail($mail, "", $message, $header);
            }
                         header("Location: send-valide.php");
    ?>

    -
    Edité par FredDuss 15 octobre 2020 à 14:48:14

    • Partager sur Facebook
    • Partager sur Twitter
      15 octobre 2020 à 7:20:03

      Bonjour,

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Manque de recherche

      La question que vous posez est très fréquente, cela démontre un manque de recherche évident. Internet et ce forum fourmillent de ressources répondant à votre besoin.

      Je vous invite à effectuer de vraies recherches qui sont à la base d'un bon apprentissage…

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        15 octobre 2020 à 7:59:50

        Bonjour,

        déjà, tu fais un test pour savoir si tes variables existes (ligne 29) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire

        ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)

        après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)

        sans oublier c'est la fonction "header" et non "Header"

        tu passes de "$header" à "$headers" ligne 52 et 53. du coup tu vas avoir 2 fois "From" après correction, donc la ligne 49 est inutile

        ton "if" n'a pas l'air d'être fermer. Regarde comment on "indente" un code, c'est plus facile à lire et a debugger

        • Partager sur Facebook
        • Partager sur Twitter
          15 octobre 2020 à 11:51:35

          Aurélien.C a écrit:

          Bonjour,

          déjà, tu fais un test pour savoir si tes variables existes (ligne 29) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire

          ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)

          après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)

          sans oublier c'est la fonction "header" et non "Header"

          tu passes de "$header" à "$headers" ligne 52 et 53. du coup tu vas avoir 2 fois "From" après correction, donc la ligne 49 est inutile

          ton "if" n'a pas l'air d'être fermer. Regarde comment on "indente" un code, c'est plus facile à lire et a debugger


          Merci j'ai corrigé les petitds détails que tu viens d’énumérer. Ma requête fonctionne correctement les champs sont mis à jour dans la BDD et le formulaire. Mais la redirection ne marche pas..
          • Partager sur Facebook
          • Partager sur Twitter
            15 octobre 2020 à 12:25:21

            Code actualisé.... merci

            -
            Edité par Aurélien10! 15 octobre 2020 à 12:25:37

            • Partager sur Facebook
            • Partager sur Twitter
              15 octobre 2020 à 14:49:22

              Aurélien.C a écrit:

              Code actualisé.... merci

              -
              Edité par Aurélien.C il y a environ 1 heure


              c'est actualisé, tu peux m'aider ??
              • Partager sur Facebook
              • Partager sur Twitter
                15 octobre 2020 à 16:11:09

                Il aurait été plus efficace de poster le nouveau code dans un nouveau message, là on perd l'historique ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Pas d'aide concernant le code par MP, le forum est là pour ça :)

                  15 octobre 2020 à 20:44:07

                  surtout quand ce qu'on demande n'est pas corrigé
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 octobre 2020 à 6:21:03

                    Lamecarlate a écrit:

                    Il aurait été plus efficace de poster le nouveau code dans un nouveau message, là on perd l'historique ;)

                    Merci pour ta reponse, voici le nouveau code
                    <?php
                    if(isset($_POST['forminscription'])) {
                       $nom = htmlspecialchars($_POST['nom']);
                       $prenom = htmlspecialchars($_POST['prenom']);
                       $rue = htmlspecialchars($_POST['rue']);
                       $ville = htmlspecialchars($_POST['ville']);
                       $codepostal = htmlspecialchars($_POST['codepostal']);
                       $email = htmlspecialchars($_POST['email']);
                       $telephone = htmlspecialchars($_POST['telephone']);
                       $pays = htmlspecialchars($_POST['pays']);
                       
                      }
                      else
                      {
                      $nom = $_POST['nom'];
                      $prenom = $_POST['prenom'];
                      $pays = $_POST['pays'];
                      $tel = $_POST['tel'];
                      $email = $_POST['email'];
                      $logo = "";
                      $site_email = "123456@gmail.com";
                      }
                       if(!empty($_POST['nom']) AND !empty($_POST['prenom']) AND !empty($_POST['rue']) AND !empty($_POST['ville']) AND !empty($_POST['codepostal']) AND !empty($_POST['email']) AND !empty($_POST['telephone']) AND !empty($_POST['pays'])) {
                                     
                                         $q=$db ->prepare("INSERT INTO paiement(nom, prenom, rue, ville, codepostal, email, telephone, pays) VALUES('$nom', '$prenom', '$rue', '$ville', '$codepostal', '$email', '$telephone', '$pays')");
                                         $q->execute(array($nom, $prenom, $rue, $ville, $codepostal, $email, $telephone, $pays, $key));
                                
                              $message = '123456@gmail.com';
                    
                              $message = "<html><head><title>".$site_email."</title></head>
                              <body>
                              Nom : ".$nom."<br />
                              Nom : ".$prenom."<br />
                              Email : " .$email."<br />
                              Pays : " .$pays."<br />
                              Tél : " .$telephone."<br />
                              </body></html>";
                                         $header="MIME-Version: 1.0\r\n";
                                         $header.='Content-Type:text/html; charset="uft-8"'."\n";
                                         $header.='Content-Transfer-Encoding: 8bit';
                                         $header.= 'From: '.$nom.' <'.$email.'>'."\r\n";
                                         $header.= 'Reply-To: '.$email.  "\r\n";
                                          $message='
                                         <html>
                                            <body>
                                            Cliquez sur le lien ci-dessous pour confirmer votre inscription et activer votre compte personnel:
                                            <br />
                                               <div align="center">
                                                <a href="http://localhost/3193/confirme.php?nom'.urldecode($nom).'&key'.$key.'">Confirmer mon compte !</a>
                                                <br />
                                                <br />
                                                Merci de votre confiance et à très bientôt,
                                                <br />
                    PS: Ceci est un email automatique, merci de ne pas y répondre.
                                               </div>
                                            </body>
                                         </html>
                                         ';
                                        mail($mail, "", $message, $header);
                            }
                                         header("Location: send-valide.php");
                    ?>



                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 octobre 2020 à 7:15:24

                      déjà, tu fais un test pour savoir si tes variables existes (ligne 23) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire

                      ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)

                      après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 octobre 2020 à 8:04:38

                        Aurélien.C a écrit:

                        déjà, tu fais un test pour savoir si tes variables existes (ligne 23) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire

                        ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)

                        après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)

                        Merci

                        Les variables existent, ma requête fonctionne correctement les champs sont mis à jour dans la BDD et le formulaire. Mais la redirection ne marche pas.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 octobre 2020 à 8:53:26

                          Comment sais-tu que la redirection ne fonctionne pas ? Tu as fait un echo + exit dans le script cible pour en être sûr ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            16 octobre 2020 à 12:24:14

                            FredDuss a écrit:

                            Aurélien.C a écrit:

                            déjà, tu fais un test pour savoir si tes variables existes (ligne 23) après les avoir récupérer (ligne 3 & Cie ), c'est l'inverse à faire

                            ensuite, pas de htmlspecialchars sur les données entrée en BDD (cf signature)

                            après, relis le cours sur la préparation d'une requête car elle ne l'est pas (il n'y pas de marqueur)

                            Merci

                            Les variables existent, ma requête fonctionne correctement les champs sont mis à jour dans la BDD et le formulaire. Mais la redirection ne marche pas.

                            Impatient de voir quand tu auras une ' ou un " dans un nom de rue de nom de personne.

                            Et quand tu te feras détruire ta bdd par une simple requête.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              16 octobre 2020 à 13:31:41

                              Il faut tout de même dire que PHP/PDO n'est tout de même pas très bien foutu : sur sa requête préparée, mal utilisée donc, il fait des binds sauf que sa requête n'a aucun marqueur mais PDO n'émet aucune erreur pour autant. Personnellement, je m'attendrais au contraire d'autant que quand rien que le nombre de marqueurs figurant dans la requête et bindés ne correspond pas on obtient habituellement une SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens.

                              Or il semblerait (je ne sais pas s'il a activé les erreurs PDO/SQL mais ce n'est pas la première fois que je le remarque) que dans le cas où PDO ne trouve aucun (0) marqueur dans la requête il ignore totalement ce que l'on a bien pu binder au lieu de vérifier qu'il y a bien 0 binds. feature ? bug ?

                              Si je trouve le temps, je testerais pour confirmer (ou infirmer) cela voire creuser la question.


                              EDIT : il y a définitivement un bug :

                              • pour PostgreSQL sans émulation (off, par défaut), l'excès de binds est détecté par PostgreSQL à l'exécution de la requête
                              • pour PostgreSQL avec émulation forcée : ce même excès est totalement ignoré, ma requête préparée est exécutée avec succès
                              • pour MySQL avec l'émulation (on, par défaut), idem, l'excédent est ignoré, la requête est exécutée normalement
                              • en revanche, toujours pour MySQL mais sans émulation, ça devient bizarre : aucune erreur n'est reportée mais c'est comme si ma requête ne renvoyait rien

                              Ca devient encore plus étrange si au lieu de faire le bind de mon paramètre qui n'existe pas dans la requête par bindValue au lieu d'execute, le résultat de la requête est bon cette fois (et ce paramètre superflu est toujours silencieusement ignoré)

                              Pour l'émulation qui ne détecte pas ces binds superflus, je pense que :

                              	if (!placeholders) {
                              		/* nothing to do; good! */
                              		return 0;
                              	}
                              

                              est fait trop tôt, même si aucun marqueur n'a été trouvé dans la requête préparée, il faudrait tout de même contrôler le nombre de binds pour s'assurer qu'il vaut également 0 (bindno != zend_hash_num_elements(params)).

                              Quant au bug MySQL sans émulation pour trop de binds, il s'avère finalement que ce n'est pas un bug : j'ai fait l'erreur de ne pas regarder ce que retournait PDOStatement::execute et de croire que j'aurais une erreur/exception suivant le mode d'erreur de PDO or il s'avère que PDOStatement::execute peut planter en retournant simplement FALSE sans aucune erreur/exception ! Sans émulation, c'est la fonction static int pdo_mysql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *param, enum pdo_param_event event_type) qui est exécutée pour gérer les binds (potentiellement) à différents moments. On y trouve bien un test pour vérifier qu'on ne cherche pas à binder plus de paramètres et si c'est le cas retourne 0 :

                              				if (param-&gt;paramno &lt; 0 || param-&gt;paramno &gt;= S-&gt;num_params) {
                              					strcpy(stmt-&gt;error_code, "HY093");
                              					PDO_DBG_RETURN(0);
                              				}
                              

                              Si on remonte les appelants, ça nous conduit à static bool really_register_bound_param(struct pdo_bound_param_data param, pdo_stmt_t stmt, bool is_param) :

                              if (!stmt-&gt;methods-&gt;param_hook(stmt, pparam, PDO_PARAM_EVT_ALLOC)) {
                              

                              Puis à ... tada : PHP_METHOD(PDOStatement, execute) par :

                              			if (!really_register_bound_param(&amp;param, stmt, 1)) {
                              				if (!Z_ISUNDEF(param.parameter)) {
                              					zval_ptr_dtor(&amp;param.parameter);
                              				}
                              				RETURN_FALSE;
                              			}
                              

                              Où en fait, PDOStatement::execute ne fait que renvoyer FALSE. Pour faire remonter l'erreur, noter qu'en plus le code de départ avait bien défini une erreur SQL HY093 mais il manque(rait) un appel à la macro PDO_HANDLE_STMT_ERR(); avant RETURN_FALSE;.

                              TL;DR/conclusion : méfiez-vous, vos requêtes préparées peuvent planter sans pour autant obtenir la moindre erreur ou exception. Et que ça manque totalement de cohérence (bon, je sais bien, ce n'est pas forcément évident dans le cas de PDO d'obtenir le même comportement pour tous les SGBD) : il est possible, même pour les erreurs, que suivant le SGBD/pilote, qu'il y ait émulation ou non, que le résultat obtenu puisse être totalement différent.

                              -
                              Edité par julp 16 octobre 2020 à 21:52:55

                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 octobre 2020 à 15:49:34

                                christouphe a écrit:

                                Comment sais-tu que la redirection ne fonctionne pas ? Tu as fait un echo + exit dans le script cible pour en être sûr ?

                                Oui, j'ai fait un echo + exit dans le script et ça marche, mais quand je fais le header location, ça ne redirige pas.

                                Si tu as un exemplaire, envoi moi je vais carrément le mettre en place. Je galère depuis 2 jours sur ça..

                                -
                                Edité par FredDuss 16 octobre 2020 à 15:53:52

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Probleme avec Header Location - Redirection

                                × 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