IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Redirection avec la fonction "header"


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut Redirection avec la fonction "header"
    Bonjour,

    Je viens vous demander un peu d'aide car j'ai un petit problème de header();

    Voici un bout de mon site, plus simple qu'un long discours

    Voici ma page index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?PHP require_once('include.inc.php');
     
    $title = 'Accueil';
     
    require_once('page/head.inc');
    require_once('page/menu.inc');
     
    ECHO '<DIV ID="INNER"> Un peu de blabla histoire de voir...</DIV>';
     
    require_once('page/foot.inc');
    ?>
    Depuis la page index.php j'ai un lien vers une page connexion.php. Le code est quasi identique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?PHP require_once('include.inc.php');
     
    $title = Connexion';
    
    require_once('page/head.inc');
    require_once('page/menu.inc');
    
    require_once('script/connection.inc');
    
    require_once('page/foot.inc');
    ?>
    La page connexion.php fait appel au script connexion.inc que voila
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    <?PHP
    if (isset($_GET['mode']) && ($_GET['mode']=='deconnexion')) {
      /**Gestion simple de la deconnexion**/
      SESSION_UNSET (); 
      SESSION_DESTROY();
      redirige('index.php');
      exit;
    }
    else if (isset($_SESSION['login']) && isset($_SESSION['id'])) { 
      redirige('error.php'); 
      exit;  
    }
     
    /**Début du script de connexion**/
    if (isset($_POST) && !empty($_POST['login']) && !empty($_POST['pwd'])) {  
      extract($_POST);
      $test = connection($login,$pwd);
     
      if ($test == false) {    
        ECHO formulaire(1);    
      }    
    }
    else { 
      ECHO formulaire(0);
    }
     
     
    /**FONCTIONS**/
    function formulaire($etat) {
      if (!empty($etat) && $etat == 1) {
        $message = msg('ERREUR', 'Saisie du login/mot de passe incorrect !');
      }
      else { $message = ''; }
     
      $formConnection = '<FORM method="POST" action="connection.php" />'; 
      $formConnection .= '<DIV ID="FORM">';
      $formConnection .= '<TABLE>';  
      $formConnection .= '<TR>';
      $formConnection .= '<TD>Login : </TD>';
      $formConnection .= '<TD><INPUT type="texte" value"" name="login"  MAXLENGTH="60"/></TD>';
      $formConnection .= '</TR>';  
      $formConnection .= '<TR>';
      $formConnection .= '<TD>mot de passe : </TD>';
      $formConnection .= '<TD><INPUT type="password" value"" name="pwd"  MAXLENGTH="60"/></TD>';
      $formConnection .= '</TR>';  
      $formConnection .= '<TR>';
      $formConnection .= '<TD colspan="2" align="center"><BR /><INPUT type="submit" value="connexion" name="submit" /></TD>';
      $formConnection .= '</TR>';  
      $formConnection .= '</TABLE>';
      $formConnection .= $message;
      $formConnection .= '</DIV>';
      $formConnection .= '</FORM>';
     
      return $formConnection; 
    }
     
     
    function connection ($login, $pwd) {
     
      $query = "SELECT log_id,log_user,log_pwd,log_droit FROM login WHERE log_user='".quote_smart($login)."' LIMIT 1";
      $ligne = rqtSelect($query);
     
      if (!empty($ligne)) {
        foreach ($ligne as $value) {
          $rqtLogin = $value['log_user'];
          $rqtPwd = $value['log_pwd'];
          $rqtId = $value['log_id'];
          $rqtDroit = $value['log_droit'];
        }  
     
        if (($pwd == $rqtPwd) && ($login == $rqtLogin)) {
          session_start();
          $_SESSION['login'] = $rqtLogin;
          $_SESSION['id'] = $rqtId;
          $_SESSION['droit'] = $rqtDroit;
          redirige('index.php');
          exit; 
        }
        else {
          return false;
        }
      }
      else {
        return false;
      }
    }
    ?>
    La fonction redirige(); se situe dans include.inc.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?PHP function  redirige($url) {
      header('Location: '.$url);
      exit;
    }
     
    session_start();
     
    require_once('sql/cnx.inc');
    require_once('script/divers.inc');
    ?>
    Chaque fois que je fais appel à la fonction redirige(); j'obtiens l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: Cannot modify header information - headers already sent by (output started at /mnt/166/sda/1/8/***/***/page/head.inc:18) in /mnt/166/sda/1/8/***/***/include.inc.php on line 3
    Pourtant cette fonction se situe tout en haut de mes pages (1er REQUIRE effectué), et la fonction est lancée avant tout affichage - enfin je crois. L'affichage débute avec require_once('page/head.inc');

    Qu'est-ce que je fais de mal ?

    En local tout fonctionne parfaitement, mais une fois en ligne (chez free) là ça merdouille. Mon autre question est comment faire réagir le site en local de la même manière qu'en ligne ?

  2. #2
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    Par défaut
    Salut,
    Pour commencer tu devrais commencer par respecter la case « echo » et non « ECHO », « <?php » et non « <?PHP » etc...
    Deuxièmement évite d'utiliser des require_once partout si ce n'est pas necessaire.

    Pour ton message d'erreur il te dit qu'il a déjà envoyé l'en-tête et qu'il ne peut pas la modifier...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Kennel sébastien Voir le message
    Salut,
    Pour commencer tu devrais commencer par respecter la case « echo » et non « ECHO », « <?php » et non « <?PHP » etc...
    Je n'ai jamais eu l'impression que ça avait un impact. Mais je note la remarque

    Citation Envoyé par Kennel sébastien Voir le message
    Deuxièmement évite d'utiliser des require_once partout si ce n'est pas necessaire.
    Je devrais utiliser REQUIRE tout court ? Je n'ai rien lu qui allait dans ton sens dans la doc PHP (qu'il faut éviter d'utilise REQUIRE_ONCE parce que ...). Pourrais-tu me préciser cette remarque stp.

    Citation Envoyé par Kennel sébastien Voir le message
    Pour ton message d'erreur il te dit qu'il a déjà envoyé l'en-tête et qu'il ne peut pas la modifier...
    Merci mais j'avais compris le message
    Je dois me tromper mais cette fonction devrait rediriger avant d'envoyer un en-tête. me trompe-je ?

  4. #4
    Membre averti Avatar de Kennel sébastien
    Homme Profil pro
    Développeur
    Inscrit en
    Septembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 226
    Points : 329
    Points
    329
    Par défaut
    Ce n'est pas par ce que PHP te laisse faire n'importe te quoi que tu dois le faire...
    A ton avis le quel est plus écomomique entre require et require_once ?
    Ton erreur est que tu dois avoir une en-tête html avant, c'est pas plus compliquer...

  5. #5
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    pour une explication sur cette erreur, voir la : http://php.developpez.com/faq/index....s_already_sent

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci Eusebe pour le lien vers la FAQ. Le problème est que j'avais déjà lu cet article et je pensai avoir bien fait la chose pour éviter ce problème.

    Existe t-il un moyen de savoir qu'est-ce qui est envoyé exactement ?

    Existe t-il un moyen de provoquer le même comportement en local afin de faciliter la recherche ?

    Merci

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bonjour,

    A priori, l'envoi des en-têtes http (et non html ) se fait dans head.inc (output started at /mnt/166/sda/1/8/***/***/page/head.inc:18).

    Peux-tu nous montrer le contenu de ce fichier ?

    Pour obtenir le même comportement en local, normalement il devrait suffire de récupérer les mêmes fichiers et de faire la même requête...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Voici le fichier head.inc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    $head = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"';
    $head .= '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
     
    $head .= '<HTML>';
    $head .= '<HEAD>';
    $head .= '<TITLE>'.$title.'</TITLE>';
    $head .= '<LINK rel="stylesheet" type"text/css" href="design/design.css" />';
    $head .= '</HEAD>';
    $head .= '<BODY>';
     
    $head .= '<DIV ID="HEAD">';
    $head .= '<img src="design/images/logo.png" />';
    $head .= '</DIV>';
     
    $head .= '<DIV ID="MAIN">';   
     
    echo $head;
    ?>
    Je fais tourner exactement la même version en local et en ligne. En scrutant le comportement à l'aide de headers_sent(), je constat que la version local ne pose aucun problème de header contrairement à la version en ligne.

    J'ai tenté de placer le fonction redirige() dans le fichier head.inc mais le problème subsiste.

    Quelques modifications de la fonction pour la rendre utilisable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function  redirige($url) {
      if (!headers_sent()) {
        header('Location: '.$url);
        exit;
      }
      else {
        echo '<script type="text/javascript" window.location.href="'.$url.'";></script>';
        echo '<noscript><meta http-equiv="refresh" content="0;url='.$url.'" /></noscript>';
      }
    }
    ça fonctionne très bien mais il ne passe jamais dans le header() et ça m'agace

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Si j'utilise ob_start(); et ob_end_flush(); ça fonctionne nickel.
    Est-ce qu'il y a une contre-indication à cette méthode ?

    par exemple pour index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    ob_start();
    require('include.conf');
     
    $title = 'Accueil';
     
    require('page/head.inc');
    require('page/menu.inc');
     
    ECHO '<DIV ID="INNER"> Ici du blabla ou un script php</DIV>';
     
    require('page/foot.inc');
    ob_end_flush();
    ?>

  10. #10
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Bizarre que ça fonctionne en local...

    Les en-têtes http sont envoyés quand tu fais echo $head; dans head.inc

    L'inconvénient que je vois à l'utilisation des fonctions de bufferisation de sortie, c'est principalement que ça masque une conception 'améliorable' du site.

    Il serait par exemple plus 'propre' de séparer la gestion des données (qui inclus le contrôle des paramètres) de la présentation au client (le html).

Discussions similaires

  1. Redirection avec la fonction "header"
    Par jpguiche dans le forum Langage
    Réponses: 8
    Dernier message: 30/04/2010, 12h28
  2. Redirection avec la fonction header
    Par bit_o dans le forum Langage
    Réponses: 3
    Dernier message: 09/02/2008, 00h56
  3. Redirection avec la fonction header
    Par Antho13 dans le forum Langage
    Réponses: 6
    Dernier message: 08/08/2007, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo