PHP et redirect

Résolu
Bonjour,

Pour s'implifier et unifier toutes mes connexions à ma BD MySQL, j'ai décidé de créer un fichier "connexion.php" et de faire un include dans chacune de mes pages qui vont utiliser la BD. Même s'il n'y a pas aucun lien vers ce fichier, il est toujours possible d'y accéder en tapant l'adresse directement. Comme ça donne une page web vide, je veux faire une redirection vers la page principale pour éviter de tomber sur une page blanche.

Dans ma page, j'ai fais un echo de ça :
"<html><head><meta HTTP-EQUIV=\"REFRESH\" content=\"0; url=monUrl"></head></html>"
comme il est fait en HTML pour faire des redirections.

Le problème c'est qu'à chaque fois qu'une page fait le include du fichier PHP, il fait la redirection, donc des boucles de reload car ma page principale utilise le "connexion.php".

Est-ce qu'il existe un autre moyen !?

Merci!
Configuration: MacOSX / Windows XP
Firefox 3.0

28 réponses

Résumé de la discussion

Le problème posé est qu’un fichier de connexion PHP inclus dans chaque page déclenche une redirection vers la page principale, entraînant des boucles de chargement lorsque la page principale réinclut également ce fichier. Plusieurs réponses suggèrent d’éviter d’envoyer des en-têtes après sortie HTML, par exemple en plaçant la redirection avant tout affichage ou en utilisant header_sent() pour conditionner le redirect. D’autres proposent d’éviter le cycle en déplaçant la logique vers une page d’erreur et en utilisant require_once('connexion.php') ou une redirection vers erreur.php afin de ne pas inclure directement la page principale.

Bobot (l’IA à votre service)
  1. Finalement, j'ai repensé à mon affaire pendant le restant de la journée et j'ai vérifier s'il existait une fonction qui vérifiait si le header a été définit. Je me suis rappeler du warning que j'obtenais quand j'exécutais la fonction header en plein milieu du code HTML.

    J'ai trouvé la fonction header_sent() qui vérifie si les éléments du header ont été envoyés. Donc j'ai mit le code suivant dans le fichier connexion.php :

    if(header_sent())
    {
    header( "Location: ...");
    }

    Si les headers ne sont pas envoyer, il fait le redirect. Je mets le include 'connexion.php' en plein milieu de mon code. Dans ce cas il ne fait pas le redirect.

    Je trouve cette solution un peu plus clean et moins difficile et moins longue. Je n'ai rien à modifier dans les autres fichiers qui utilisent le fichier connexion.php. La seule chose à faire c'est de ne pas faire le include au début du fichier (avant les balises head HTML)

    Merci quand même pour ton aide!
    J'espère que ça pourra t'aider ou n'importe qui dans une situation semblable!
    1. De rien, si tu as des soucis à mettre en place ceci, pas de problèmes je suis là. ;)
      1. En effet, c'est un peu long, mais au moins je suis sur que ça va marcher!

        Merci de ton aide et ta patience ;)

        Je vais essayer ça ce soir (heure du Québec) et redonner des nouvelles sur le post.
        1. oui c'est normal...

          Alors j'ai réfléchit et effectivement il faut peut être laisser tomber le header pour connexion.php

          Tu pourrai utiliser une variable qui te permetterai "l'autorisation d'acceder à certaines pages"

          je m'explique: tu crée une variable index qui est le nom de ta page.
          par exemple index.php?index=index pour ta page principale
          ..................connexion.php?index=connexion pour ta page connexion

          Alors tu vérifie ta variable index
          if( isset($_GET['index']) && !empty($_GET['index']) )
          {
          $index = $_GET['index'].".php" ; //tu récupere le nom du chemin que tu met ds une variable php
          }
          else $index = "index.php"; //comme ça si la variable index n'existe pas elle sera initialiser à ta page principale

          if ($index=='index.php' || $index=='tesAutresPages.php') //bien sûr tu ne met pas connexion.php
          include($index);
          else
          {
          include(erreur.php);
          }

          tu peux essayer cela, c'est un peu long à mettre en place mais comme ça tu gere pages que l'utilisateur peut voir.
          Il ne faudra pas oublier de fournir index pour chacune de tes pages sinon tu tombera sur la page erreur.
          1. fichier connexion.php :
            <?php
            //Avoir les infos
            //$hostname = "localhost";
            $hostname = "10.6.186.33";
            $user = "----";
            $pass = "----";

            header ( "Location: ./erreur.php" );
            ?>

            fichier index.php
            <?php
            //include le fichier de connexion
            require_once("connexion.php");

            //connecter a la BD
            $conn = mysql_connect($hostname,$user,$pass);

            //choisir la bd
            mysql_select_db ("leclerc_Donnee",$conn);

            //Faire un bon query
            $result = mysql_query("select * from News order by id desc limit 10");

            //traitement
            while($row = mysql_fetch_array($result))
            {
            echo "<tr><td>";
            echo $row['Date'];
            echo "</td><td>";
            echo $row['Text'];
            echo "</td></tr>";
            }//while

            //fermer la connexion
            mysql_close($conn);
            ?>
            1. Alors essaye de faire ton require_once en début de page avant tout ce que tu as.
              1. Je crois que le require_once ne marche pas car il importe quand même la fonctioner header(). Si j'importais un deuxième fichier avec la fonction header(). là le require_once marcherait.
                1. Hum, j'ai bien ajouter le fichier erreur.php. J'ai modifier le fichier connexion.php pour que la fonction header() pointe vers erreur.php. Par contre, j'ai toujours l'erreur dans mon fichier principal comme quoi je ne peux pas changer les informations du header :

                  Warning: Cannot modify header information - headers already sent by (output started at /home/content/k/e/n/kenshin24/html/index.php:24) in /home/content/k/e/n/kenshin24/html/connexion.php on line 8

                  Merci
                  1. Donc tu fais un header ( "Location: ./erreur.php" ); dans connexion.php apres tes parametres php
                    et tu met require_once('connexion.php'); dans ta page principale dans le code php ou tu en a besoin
                    1. Ahhhh,
                      c'est normal: dans ta page principale tu tente d'inclure ta page connexion.php qui te redirige vers ta page principale, donc tu inclut ta page principale qui inclut connexion.php qui te redirige vers ta page principale et ainsi de suite...

                      Donc tu ne peux pas faire un header dans connexion.php vers ta page principale. Le mieux serai de creer une page erreur.php qui te dirai "cette page n'exite pas" et tu redirige connexion.php vers cette page.

                      mais en fesant un include tu "incluera" cette page dans la tienne. Et ce n'est pas ce que tu veux je presume.

                      Donc utilise: require_once('connexion.php'); qui chargera ton code php
                      1. Au début oui, quand j'avais le message de Warning de PHP qui ne pouvait modifier le warning. Ensuite, j'ai déplacé mon include au début de la page avec n'importe quelle balise HTML. Dans cette situation, j'ai une boucle infinie de redirection.
                        1. je crois savoir pourquoi...
                          tu appelle ta page connexion.php après du code HTML ou JavaScript non?
                          1. Exact, je déclare quelques variables à l'intérieur d'une balise <?php ?>
                            1. En gros c'est ça. La page contient seulement les infos nécessaires à la connexion (username, password et hôte).
                              Je suis capable de l'inclure sans problème.

                              Par contre, si je fais http://www.domaine.com/connexion.php, ça me renvoit une page blanche vide. Je veux éviter ça en faisant une redirection.

                              Merci
                              • 1
                              • 2