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 :

Output buffering et entêtes


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut Output buffering et entêtes
    Bonjours, j'ai une petite question à quoi sert le output_buffering car quand il est désactivé j'ai une erreur qui est la suivante:

    Les headers, lorsqu'elle sont inclus dans une page php qui sont reliés à un form action de ma page d'authentification, ne fonctionnent pas. Tous semblent fonctionner correctement sauf qu'aucune redirection se fait.

    Le fait que je doit activer output_buffering vient-elle d'une erreur que j'ai commis sans m'en rendre compte!

    Merci d'avance!

  2. #2
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 565
    Points : 7 293
    Points
    7 293
    Par défaut
    En fait, les headers doivent être envoyés avant toute autre information sinon ils ne fonctionnent pas. Par exemple, laisser une espace ou autre avant ta balise <?php empêchera ton header de fonctionner.

    Le output_buffering permet de rediriger tout ce que ton code pourrait écrire (par exemple avec écho ou simplement avec une ou un warning) vers un tampon, afin par exemple que rien de tout cela ne s'affiche.

    Tu dois tout simplement avoir une partie dans ton code qui écrit quelque chose sur ta page, ce qui empêche les headers de fonctionner correctement.
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Wow très bien expliqué je regarde cela!

    Est-ce que c'est dangereux ou mal vu d'utiliser les output_buffering?

  4. #4
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par frankiboy Voir le message
    Wow très bien expliqué je regarde cela!
    Est-ce que c'est dangereux ou mal vu d'utiliser les output_buffering?
    Bonjour,
    trés franchement il faut savoir manier ça, par exemple ne pas dépasser la taille du buffer etc... bref moi je fuis cette possibilitée !

    Un extrait de notre FAQ sur ce point

    Cette directive est habituellement désactivée, car la majorité des applications n'en ont pas besoin. De plus, celles qui utilisent ce type de buffer ont généralement un besoin très particulier qu'il est préférable de manipuler dans le script lui-même par la fonction ob_start().
    http://g-rossolini.developpez.com/tu...ours/?page=ini

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Je comprend pas .... je trouve vraiment pas d'espace ou echo ou die.

    Voici mon code...

    Page d'authentification (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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
     <head>
      <title>Connexion au site</title>
      <link href="style.css" rel="stylesheet" type="text/css" />
     </head>
     <body>
    	<div id="xlogin">
    	<form action="modules/verifLogin.php" name="xform" method="post">
        <fieldset>
        <legend>Identification</legend>
        <div class="frmrow">
            <label for="xLogin">Nom d'utilisateur : </label>
            <input type="text" name="xLogin" id="xLogin" value="" class="cell" size="25" maxlength="20" />
            <br />	
            </div>
            <div class="frmrow">
            <label for="xPass">Mot de passe : </label>
            <input type="password" name="xPass" id="xPass" value="" class="cell" size="25" maxlength="50" />
            <br />	
            </div>
            <div class="frmrow">
            <label for="xPass">&nbsp; </label>
            <input type="submit" value="Connexion">
            <br />	
            </div>
         </fieldset>
        </form>
    	</div>
     </body>
    </html>
    page de verification (verifLogin.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
    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
    <?php
    // On démarre la session
    session_start();
     
    $loginOK = false;  // cf Astuce
     
    // On n'effectue les traitement qu'à la condition que 
    // les informations aient été effectivement postées
    if ( isset($_POST) && (!empty($_POST['xLogin'])) && (!empty($_POST['xPass'])) ) {
     
      extract($_POST);  // je vous renvoie à la doc de cette fonction
     
      include "../../connections/less.php";
     
      // On va chercher le mot de passe afférent à ce login
      mysql_select_db("destination_db");
      $sql = "SELECT login, mdp, nom_complet FROM users WHERE login = '".addslashes($xLogin)."'";
      $req = mysql_query($sql); 
     
      // On vérifie que l'utilisateur existe bien
      if (mysql_num_rows($req) > 0) {
         $data = mysql_fetch_assoc($req);
        // On vérifie que son mot de passe est correct
        if ($xPass == $data['mdp']) {
          $loginOK = true;
        }
      }
     
      include "../../connections/close.php";
    }
    // Si le login a été validé on met les données en sessions
    if ($loginOK) {
      $_SESSION['login'] = $data['login'];
      $_SESSION['mdp'] = $data['mdp'];
      $_SESSION['nomComplet'] = $data['nom_complet'];
      $_SESSION['loginOK'] = $loginOK;
      header('Location: ../main.php');
    }
    else{
      header('Location: ../index.php');
    }
    ?>
    et voici les erreurs que j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at E:\wamp\www\dev\admin\modules\veriflogin.php:1) in E:\wamp\www\dev\admin\modules\veriflogin.php on line 3
     
    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at E:\wamp\www\dev\admin\modules\veriflogin.php:1) in E:\wamp\www\dev\admin\modules\veriflogin.php on line 3
     
    Warning: Cannot modify header information - headers already sent by (output started at E:\wamp\www\dev\admin\modules\veriflogin.php:1) in E:\wamp\www\dev\admin\modules\veriflogin.php on line 37

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Tu te sers régulièrement de l'éditeur que tu as utilisé pour faire ce script ? On pourrait penser que c'est une merde liée au BOM.

    Essaye de passer l'encodage en ISO pour voir.
    Pourfendeur de singletons en croisade

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    J'ai ajouté l'encode iso dans ma page html index mais toujours les trois même erreurs! Je comprend pas

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
     <head>
     <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">
      <title>Connexion au site</title>
      <link href="style.css" rel="stylesheet" type="text/css" />
     </head>
     <body>
    	<div id="xlogin">
    	<form action="modules/verifLogin.php" name="xform" method="post">
        <fieldset>
        <legend>Identification</legend>
     
        <div class="frmrow">
            <label for="xLogin">Nom d'utilisateur : </label>
            <input type="text" name="xLogin" id="xLogin" value="" class="cell" size="25" maxlength="20" />
            <br />	
            </div>
     
            <div class="frmrow">
            <label for="xPass">Mot de passe : </label>
            <input type="password" name="xPass" id="xPass" value="" class="cell" size="25" maxlength="50" />
            <br />	
            </div>
            <div class="frmrow">
            <label for="xPass">&nbsp; </label>
            <input type="submit" value="Connexion">
            <br />	
            </div>
         </fieldset>
        </form>
    	</div>
     </body>
    </html>

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Ah zut non.

    C'est pas l'encodage de la page qu'il faut modifier. C'est l'encodage de ton éditeur.
    Quelques infos sur le BOM et les problèmes qui y sont liés : http://fr.wikipedia.org/wiki/Byte_Order_Mark

    Sous réserve que le problème vienne de là évidemment. Mais ça y ressemble.
    Pourfendeur de singletons en croisade

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Ah d'accord dsl, j'avais mal comprit....
    Est-ce que je peut mettre UTF-8 sans BOM?
    Car je viens du Québec et ici on utilise UTF habitullement.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Oui, si ça résoud pas le probleme instantanément, copie/colle le code dans un nouveau fichier sans BOM et ça devrait aller.

    Passer l'éditeur en ISO aurait juste permis de confirmer qu'il s'agit bien de ce problème, c'était le seul intérêt
    Pourfendeur de singletons en croisade

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 26
    Points
    26
    Par défaut
    Merci je crois que le probleme de header est réglé mais j'ai un nouveau problème maintenant:S. J'ai fais une page teste pour tester ton hypothèse mais voila que j'ai trouvé un nouveau bug. C'est un problème de session on dirait. Je veux protéger une page pour empecher d'y acceder sans authentification et voici la page en question :

    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
    <?php
    	session_start();
    	if(!isset($_SESSION['loginOK'])){
    		echo "!isset";
    		die();	
    	}
    	else if (!$_SESSION['loginOK']){
    		echo "!session";
    		die();
    	}
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Document sans titre</title>
    </head>
    <body>
    <p>ca marche quoi?! </p>
    <a href="modules/logout.php">Logout</a>
    </body>
    </html>
    Je comprend pas pourquoi mais quand je m'authentifie la premieres fois j'obtiens
    le echo !isset mais si je fait précédent et je retape mon authentification ça marche! :S C'est comme si il n'avais pas créer la variable session à temps...

    Voici ma page d'authentification et ma vérification :

    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link href="css/style.css" rel="stylesheet" type="text/css" />
    <title>Page d'accueil de test</title>
    </head>
    <body>
    <form action="modules/veriflogin.php" name="xform" method="post">
            <div id="login">
                <div class="row"><label for="xLogin">Login : </label><input type="text" name="xLogin" size="25" /></div><br />
                <div class="row"><label for="xPass">Pass  : </label><input type="password" size="25" name="xPass" /></div><br />
                <div class="row"><input type="submit" value="connexion" /></div>
            </div>
        </form>
    </body>
    </html>
    et page de vérification :

    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
    <?php 
    	//demarre la session
    	session_start();
    	$loginOK = false;
     
    	if( isset($_POST) && (!empty($_POST['xLogin'])) && (!empty($_POST['xPass'])) ){
    		//connection a la base de donnee
    		include "../connections/less.php";
    		$db = mysql_select_db("destination_db",$connection);
     
    		extract($_POST);
     
    		//on va chercher le mot de passe dans (user) la table qui contient les infos
    		$sql = "SELECT login,mdp,nom_complet FROM users WHERE login = '".addslashes($xLogin)."'";
    		$req = mysql_query($sql);
     
    		//on verifie que l'utilisateur existe bien
    		if (mysql_num_rows($req) > 0) {
     
    			if($donnees = mysql_fetch_array($req)){
    				//on verifie que son mot de passe est correct
    				if($xPass == $donnees['mdp']){
    					$loginOK = true;	
    				}
    			}
    		}
    	}
     
    	$_SESSION['loginOK'] = $loginOK;
    	//si le login a ete valide on met les donnees en sessions
    	if($loginOK){
    		header('Location: ../main.php');
    	}
    	else{
    		header('Location: ../');
    	}
    ?>
    Merci d'avance!!!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer nom des columns du schéma du buffer output
    Par xamuo dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 10/01/2012, 15h34
  2. [SSIS] [2K8] Failed to add row to output buffer.
    Par clementratel dans le forum SSIS
    Réponses: 1
    Dernier message: 11/02/2011, 12h02
  3. Output buffering en PHP
    Par sylvanillo dans le forum Langage
    Réponses: 2
    Dernier message: 21/03/2007, 09h56
  4. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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