Redirection de page

Rechercher

Redirection de page

Par Eladan  -  33 reponses  -  Le 19/03/2015 17:44  -  Editer  - 

Bonjour,

Je n'arrive pas à faire fonctionner la fonction header.

Page admin

<html>
    <head>
        <link href="theme/style.css" rel="stylesheet" type="text/css"/>
        <title>Authentification - Chalet Cazé d'Ally sur Somme</title>
    </head>
    <body>
        <div id="fond"></div>
        <div id="conteneur">
            <div id="contenu">
                <?php
                    include('menu.php');
                    include('connexion.php');
                ?>

                <div id="adm">
                    <form name="admin" action="admin.php" method="post">
                        <input type="hidden" name="verif" value="yes" />
                        <table border="0">
                            <tr>
                                <td width="40%" align="right">Login : </td>
                                <td width="60%"><input type="text" name="login" value="Admin" maxlength="10"></td>
                            </tr>
                            <tr>
                                <td width="40%" align="right">Password : </td>
                                <td width="60%"><input type='password' name="pass" maxlength="10"></td>
                            </tr>
                            <tr>
                                <td colspan="2" align="center"><input type="submit" name="valider" value="Valider"></td>
                            </tr>
                        </table>
                    </form>
                </div><?php
                if ($_POST['verif'] == 'yes')
                {
                    if (isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass']))
                    {
                        extract($_POST);
                        //On recupère le password de la table qui correspond au login du visiteur
                        $sql = "SELECT Mdp FROM Admin WHERE login='".$login."'";
                        $req = mysqli_query($db, $sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysqli_error());
                        $data = mysqli_fetch_array($req);
                        // on libère la mémoire
                        mysqli_free_result($req);

                        if (md5($pass) != $data["Mdp"])
                        {
                            echo "Mauvais login / password. Merci de recommencer";
                            exit;
                        }
                        else
                        {
                            session_start();
                            $_SESSION['login'] = $login;
                            header('location: http://www.monsite/administration.php'); //On renvoit vers l'administration
                            exit;
                        }
                    }
                    else echo "Vous avez oublié de remplir le mot de passe";
                } ?>
            </div>
        </div>
    </body>
</html>

Je sais que la fonction header doit être dans l'en-tête mais si je met mon code dans l'en-tête, il ne sait pas l’interpréter en récupérant les variables...
J'ai essayé de le faire passer par un fonction mais je ne sait pas comment transcrire $_POST dans la fonction pour qu'il retrouve tous les paramètres.

Même en mettant simplement header('location: http://www.monsite/administration.php'); après la balise <head> il ne le prend pas en compte

Si quelqu'un à une idée ?

 

Réponses apportées à cette discussion

Par Eladan  -  Le 19/03/2015 18:05  -  Haut de page  - 

Si je met le code suivant j’obtiens ceci en faisant afficher le code source :
<html>
<head>

Le <html> est en rouge...
Code en question :

<head><?php
    if ($_POST['verif'] == 'yes')
    {
        if (isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass']))
        {
            include('connexion.php');
            extract($_POST);
            //On recupère le password de la table qui correspond au login du visiteur
            $sql = "SELECT Mdp FROM Admin WHERE login='".$login."'";
            $req = mysqli_query($db, $sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysqli_error());
            $data = mysqli_fetch_array($req);
            // on libère la mémoire
            mysqli_free_result($req);

            if (md5($pass) == $data["Mdp"])
            {
                //session_start();
                //$_SESSION['login'] = $login;
                header('Location: http://www.monsite.fr/administration.php'); //On renvoit vers l'administration
                exit;
            }
        }
    } ?>
    <link href="theme/style.css" rel="stylesheet" type="text/css"/>
    <title>Authentification - Chalet Cazé d'Ally sur Somme</title>
</head>
 
Par Cyrano  -  Le 19/03/2015 23:33  -  Haut de page  - 

Salut,
il est très important de comprendre que rien ne doit être envoyé vers le client (navigateur) avant les en-têtes, donc avant d'utiliser la fonction header.

Grosso-modo, ça veut dire qu'avant d'envoyer du HTML, il faut déterminer si on est sur la bonne page ou s'il faut rediriger vers une autre page.

Partant de là, regarde ton code et tâche d'imaginer une manière de faire ça : comment est-ce que tu procèderais ?

 
Par Eladan  -  Le 20/03/2015 16:03  -  Haut de page  - 

Bonjour,

Oui j'avais lu ça sur internet mais justement pour le coup je vois pas.

Pour moi, je passe une première fois pour afficher mon formulaire.
Ensuite, une fois le formulaire validé, je rentre dans mon if de la section <head> et je fais mon traitement.

A ce moment là, je n'ai rien d'envoyé vers le client, c'est que du traitement php transparent à l'utilisateur et mes echo ne renvoient quelque chose que si la condition est valide.

 
Par Cyrano  -  Le 20/03/2015 16:15  -  Haut de page  - 

Ce que tu ne sembles pas réaliser, c'est que dès l'instant où ton code est en HTML, ça envoie déjà quelque chose vers le navigateur.

Exemple :

    <html>  
      <head>  
        <title>Ma page</title>  
      </head>  
      <body>  
    <?php  
    // Exécution de code quelconque...  
    header('Location: http://uneautrepage.php'); // <== Erreur automatique  
    ?>  
      </body>  
    </html>  

Là, j'indique « Erreur automatique », tout simplement parce que toute la partie entre les balises html et body a déjà été envoyée. Pour avancer, il est indispensable de bien comprendre ce principe, et avant d'aller plus loin, je voudrais être sûr que ce point est clair, sinon, je tâcherai de formuler ça autrement.

 
Par Eladan  -  Le 21/03/2015 15:44  -  Haut de page  - 

Ok, donc tout mettre sur la même page ne fonctionnera jamais alors.

il faudrait donc que ma page admin.php renvoi vers une page validation.php qui elle fera un header vers ma page administration.php ou retour admin.php avec en paramètre le message d'erreur...

Ou alors la renvoyer dans ma page administration mais ne pas mettre de balise <html><head> et <body>

Ce qui me pose un problème car je dois incorporer <script type="text/javascript" src="ckeditor/ckeditor.js"></script> dans le <head> pour faire fonctionner ckeditor...

Quelle solution est la plus "propre" ?

 
Par Cyrano  -  Le 21/03/2015 15:52  -  Haut de page  - 

Si, on peut le faire, mais à condition de le faire dans le bon ordre.

Schématiquement, il faut construire la page AVANT de l'envoyer. Donc si je reprends le code montré précédemment en exemple, il faudrait le modifier comme ceci :

    <?php  
    if(false == $condition)  
    {  
        header('Location: http://uneautrepage.php'); // <== Là, pas d'erreur puisque le code PHP n'est précédé d'aucun code HTML 
    }  
    // Exécution de code quelconque...  
    ?>  
    <html>  
      <head>  
        <title>Ma page</title>  
      </head>  
      <body>  
        <p>Contenu de la page ... </p>  
      </body>  
    </html>  

De cette manière, on envoit rien au navigateur tant que les tests appropriés ne sont pas faits.

 
Par Eladan  -  Le 22/03/2015 13:06  -  Haut de page  - 

C'est pourtant évident et j'y ai même pas pensé.

En plus, je le fais sur ma page fonction.php, aucune balise html...
J'ai pas pensé à concaténer les deux ^^

Je test ça mais ça devrait fonctionner.

 
Par Eladan  -  Le 24/03/2015 13:25  -  Haut de page  - 

Bon, il semble que j'ai parlé trop vite, ça ne veut pas fonctionner...

J'ai simplement mis ceci dans ma page admin.php :

    <?php  
    header('Location: http://www.google.fr');  
    exit;  
    ?>  

Pourtant il ne fait rien du tout, il reste sur une page admin.php entièrement blanche et quand je fais voir code source, il n'y a aucune ligne d'interprété.

 
Par Cyrano  -  Le 24/03/2015 17:39  -  Haut de page  - 

Est-ce qu'il y a ne serait-ce qu'un espace avant le signe « <?php » ?

 
Par Eladan  -  Le 24/03/2015 20:02  -  Haut de page  - 

J'aurai bien aimé mais non.
Voici exactement ce que j'ai sur ma page pour faire un test :

<?php
header('Location: http://www.google.fr');
exit;
/*<html>
blabla html
</html>*/ ?>

Le seul espace que j'ai est le retour à la ligne après la balise <?php

 
Par Cyrano  -  Le 24/03/2015 20:08  -  Haut de page  - 

Alors on a un problème parce que cette anomalie est inattendue.

Juste au cas où, qu'est-ce que tu utilises comme environnement de développement ?

 
Par Eladan  -  Le 24/03/2015 20:35  -  Haut de page  - 

Par environnement, tu entends logiciel ?
Si oui je code sous Dreamweaver CS6, le site est hébergé sur 1&1 avec PHP en version 5.5

 
Par Cyrano  -  Le 24/03/2015 20:41  -  Haut de page  - 

Ok, tu n'as pas un environnement en local donc, du genre WAMP ou assimilé... tu devrais, c'est plus pratique. Mais bon.

C'est quoi l'url test ?

 
Par Eladan  -  Le 24/03/2015 21:06  -  Haut de page  - 

J'ai WAMP, enfin un ami m'en a parlé il y a pas longtemps mais pas pris le temps de voir comment l'utiliser.
Je code directement sur le site mais je fais une page test pour voir.
La page en question est http://www.sylfan-caze.fr/admin_test.php

 
Par Cyrano  -  Le 24/03/2015 21:16  -  Haut de page  - 

Et effectivement, ça ne fonctionne pas.

J'ai testé en local juste pour vérifier que la fonction header n'aurait pas un problème mais ça fonctionne parfaitement. Donc je ne vois pas trop.

Je serais bien tenté de me méfier de Dreamweaver, ça n,a jamais été un outil de développement et ça peut occasionnellement créer des surprises.. À ce niveau là, je te recommande d'utiliser un petit outil sympa de base comme Notepad++, il y a une coloration syntaxique et c'est un parfait outil d'apprentissage.

Juste au cas où : est-ce qu'il y a à la racine de ton site un fichier nommé « .htaccess » ? Si oui, crée un sous-dossier à la racine, du genre /test et dedans, tu y déplaces ton fichier, l'url deviendrait alors http://www.sylfan-caze.fr/test/admin_test.php

 
Par Eladan  -  Le 24/03/2015 21:28  -  Haut de page  - 

Oui je connais Notepad++. Je préfère dream car il me met un code couleur différent pour le html, php, ligne en commentaire, etc.
Après Notepad++ le fait peut être aussi mais jamais cherché comment.

Même en ouvrant la page admin_test.php avec Notepad++, je n'ai pas d'espace avant le <?php

Je reste perplexe...

Sinon non, je n'ai pas le fichier .htaccess.
A la racine du site j'ai un dossier Chalet et Logs, c'est tout.

 
Par Cyrano  -  Le 24/03/2015 21:32  -  Haut de page  - 

Tu codes directement en ligne via FTP ou tu codes un fichier local que tu envoies après en ligne avec un client FTP genre Filezilla ?

Pour la coloration syntaxique avec Notepad++, [Alt]+[L] et tu choisis le langage, tu vas voir, c'est magique ;)

 
Par Eladan  -  Le 25/03/2015 10:40  -  Haut de page  - 

Oui je code en local et envoi via Filezilla.
Je viens d'essayer en n'écrivant que ceci mais toujours rien :

<?php
header("Location: http://www.sylfan-caze.fr/dispo_test.php/");
exit;
?>
 
Par Cyrano  -  Le 25/03/2015 10:49  -  Haut de page  - 

Ok, on va tester autre chose.

Comme tu testes en ligne, tu n,as pas la main sur la configuration de PHP, on va le forcer un peu.

Modifie ton code comme ceci :

    <?php  
    ini_set('display_error', 1);  
    ini_set('error_reporting', E_ALL);  

    header('Location: http://www.sylfan-caze.fr/dispo_test.php/');  
    exit;  
    ?>  
    <html>  
      <head>  
        <title>Raté</title>  
      </head>  
      <body>  
        <h1>Raté</h1>  
        <p>La redirection à échoué</p>  
      </body>  
    </html>
 
Par Eladan  -  Le 26/03/2015 10:09  -  Haut de page  - 

J'ai le message d'erreur suivant :
Warning: Cannot modify header information - headers already sent by (output started at /homepages/31/d536289959/htdocs/Chalet/admin_test.php:1) in /homepages/31/d536289959/htdocs/Chalet/admin_test.php on line 5

 
Par Cyrano  -  Le 26/03/2015 10:19  -  Haut de page  - 

Ben voilà : il y a déjà du contenu qui a été envoyé au navigateur avant même l'exécution de la fonction header().

Un simple espace suffit à créer ce genre de bogue.
Exemple, représente-toi le fichier dans ton éditeur :

    +---------------------------------------------  
    | <?php // <== Ici, il y a un espace juste avant le « < », l'erreur sera automatique.  
    |header("Location: http://www.google.com");  
    |// ... etc. suite du code qui normalement ne devrait pas s'exécuter  
    |//..  
    |  

Voici le même sans erreur :

    +---------------------------------------------  
    |<?php  
    |header("Location: http://www.google.com");  
    |// ... etc. suite du code qui normalement ne devrait pas s'exécuter  
    |//..  
    |

Vérifie ton fichier, il y a probablement une erreur insignifiante de ce type. Ça pourrait aussi bien d'ailleurs être une première ligne vide.

 
Par Eladan  -  Le 26/03/2015 10:48  -  Haut de page  - 

Si j'ai un espace, je vois pas où.

Page admin

Et j'ai aussi vérifié. Je retourne bien à la ligne après chaque élément sans espace après.
Ex : <?php(return ligne) et non <?php (return ligne)

 
Par Cyrano  -  Le 26/03/2015 10:51  -  Haut de page  - 

Ton fichier serait-il dans ce cas inclus à partir d'un autre ?

 
Par Eladan  -  Le 26/03/2015 10:57  -  Haut de page  - 

Heu pas sur de comprendre là.
Ma page est à la racine de "Chalet" et vu que c'est admin_test.php, je l'appel en direct.

Filezilla

 
Par Cyrano  -  Le 26/03/2015 10:58  -  Haut de page  - 

À toute fin pratique, tu pourrais t'inspirer de l'exemple 1 de la documentation, ça va te permettre de pister d'où vient le problème.

Tu pourrais par exemple modifier ton fichier comme ceci :

    <?php  
    ini_set('display_error', 1);  
    ini_set('error_reporting', E_ALL);  
    if(!headers_sent($filename, $linenum))  
    {  
        header('Location: http://www.google.fr');  
        exit();  

        // Vous allez probablement déclencher une erreur ici  
    }  
    else  
    {  
            $aErreurs = debug_backtrace();  
            $sErreurs = print_r($aErreurs, true);  
            $paragraphe  = "Les en-têtes ont déjà été envoyés, depuis le fichier ". $filename ." à la ligne ". $linenum ."<br />". PHP_EOL;  
            $paragraphe .= "Il est donc impossible de vous rediriger automatiquement, aussi veuillez cliquez <a href=\"http://www.google.fr\">ici</a>.". PHP_EOL;  
            $paragraphe .= '<pre>'. $sErreurs .'</pre>'  
    }  
    ?>  
    <html>  
      <head>  
        <title>Raté</title>  
      </head>  
      <body>  
        <h1>Raté</h1>  
        <p><?php echo($paragraphe); ?></p>  

      </body>  
    </html>  
 
Par Eladan  -  Le 26/03/2015 11:05  -  Haut de page  - 

Quand je met le code :

if (!headers_sent($filename, $linenum)) {
    header('Location: http://www.example.com/');
    exit;

// Vous allez probablement déclencher une erreur ici
} else {

   echo "Les en-têtes ont déjà été envoyés, depuis le fichier $filename à la ligne $linenum\n" .
   "Il est donc impossible de vous rediriger automatiquement, aussi veuillez
   cliquez <a href=\"http://www.example.com\">ici</a>.\n";
   exit;
}

Il m'indique ceci : Les en-têtes ont déjà été envoyés, depuis le fichier /homepages/31/d536289959/htdocs/Chalet/admin_test.php à la ligne 1

Sauf qu'en ligne 1 je n'ai que le <?php comme indiqué sur l'image...

 
Par Cyrano  -  Le 26/03/2015 11:16  -  Haut de page  - 

J'ai édité ma précédente réponse en ajoutant un code plus complet pour arriver à débusquer le problème, essaye ça et préviens que je puisse voir ça en ligne.

 
Par Eladan  -  Le 26/03/2015 11:38  -  Haut de page  - 

C'est fait et il me génère un tableau vide

 
Par Cyrano  -  Le 26/03/2015 12:27  -  Haut de page  - 

Décidément, j'y comprends rien... je vais y réfléchir un peu en allant déjeuner parce que là, je ne vois vraiment pas d'où ça peut venir...

 
Par Eladan  -  Le 28/03/2015 11:49  -  Haut de page  - 

Alors j'ai peut être une réponse mais je la comprend pas vraiment.
Quand j'enregistre la page admin_test.php en "en UTF-8 (sans BOM)", le header fonctionne mais j'ai un espace qui apparait en haut de ma page :

Page

De plus les accents présent lors de mes echo ne s'affiche plus correctement.
Pour les accents en html je mettais le code associé (ex: eeacute)
Faut il, maintenant, les mettre aussi pour du code php ?

 
Par Cyrano  -  Le 28/03/2015 19:05  -  Haut de page  - 

Ça, c'est une option que je n'avais effectivement pas envisagée.

Et il faut toujours enregistrer sans BOM, sinon ça met la zone systématiquement.

Pour les accents, si tu enregistres tes fichiers en UTF8, alors il faut que dans ton en-tête HTML il y ait la balise meta associée. Tu peux aussi envoyer un header pour l'indiquer en PHP avec la même fonction header() qui te sert à la redirection, donc bien entendu avant tout envoi de HTML.

 
Par Eladan  -  Le 30/03/2015 11:26  -  Haut de page  - 

Heu je dois bien avoué que j'ai rien compris à ton message :(

Pour ce qui est de l'espace en haut, j'ai renommé toutes mes pages/liens qui interviennent dessus en sans BOM (menu, connexion, fonction, etc.) mais il est toujours là.

 
Par Cyrano  -  Le 30/03/2015 11:38  -  Haut de page  - 

Salut,
pour le BOM, voici un peu de lecture, ce sera plus simple que de tout ré-expliquer moi-même ;)

Pour le reste, à propos des en-têtes, lorsque le serveur envoit du contenu au navigateur, ça inclut des en-têtes qui ne sont pas affichés mais qui peuvent en revanche influer sur l'affichage, et l'encodage des caractères en fait partie. Généralement sur le web, on encode en UTF8 ou en Latin1 // ISO8859-1 (pour le français s'entend, pour d'autres langues, il peut y avoir d'autres encodages)

En précisant l'encodage aproprié, l'affichage se fera correctement. Sinon, les caractères en UTF8 pourront apparaitre de façon bizarre, rendant le texte moins facilement lisible.
Donc en ajoutant une balise meta dans la partie <header> du code HTML, on indique au navigateur quel encodage doit être pris en compte.

Exemple pour une page en XHTML :

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" xml:lang="fr" />

Au besoin, effectue une petite recherche avec les mots-clés « meta » et « charset », tu devrais trouver rapidement assez de lecture pour t'occuper jusqu'à Noël ;)

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |