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 :

Gestion des buffers (ob_start) [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut Gestion des buffers (ob_start)
    Bonjour,

    J'ai implémentée une fonction "include sécurisée" en utilisant les buffers (ob_start). Cela fonctionne mais je perds les variables précédemment définies dans la page "appelante".

    La solution des variables de session fonctionne mais c'est une parade peu élégante, et qui m'obligerait à recoder pas mal de pages, sans compter les risques d'erreur ou d'oublis.

    J'ai probablement loupé quelque chose dans la compréhension de l'utilisation des buffers.

    La question:
    Comment conserver dans ma page incluse "page.php" les variables précédemment définies dans la page "index.php" ?

    Merci d'avance

    ------------------------------------------
    Voilà le principe du code :

    index.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $variable_truc="22";
    secured_include("page.php", "once", DEBUG);
    ...
    page.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($variable_truc === "22") {
     echo "tout va bien, j ai récupéré ma variable comme je le souhaitais";
    }
    else {
     echo  "zut j ai un probleme, et je suis donc dans ce cas là";
    }
    secured_include (extrait)
    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
     
    function secured_include($file, $option="once", $debug=FALSE) {
    ....
    	if (!in_array($path, get_included_files())) {
    		ini_set('implicit_flush', 'false'); // redondance avec le php.ini de prod
    		ini_set('output_buffering', 'Off');
    		ob_start();
    		if (strtolower($option) == "once") {
    			include_once $path;
    		}
    		else {
    			include $path;
    		}
    		$content = ob_get_contents();
    		ob_end_flush();
    		return $content;
    		}
    		else {
    		return TRUE;
    	}
    ..
    }

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Les "includes" et "requires" sont traités comme des prolongements du script en cours et leurs scopes est donc le même que celui du script en cours.

    Toi, tu surcharges ça par une fonction perso.

    Le scope de ta fonction est donc celui de toute fonction définie par l'utilisateur et en toute logique elle ne bénéficie donc pas des variables existantes dans le script en cours.

    Il faut lui donner en paramêtre.

  3. #3
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Merci pour cette explication.

    j'avais un petit espoir en incluant la-dite fonction dans l'index mais visiblement là n'est pas le probleme.

    Mais je ne comprends pas bien pourquoi. Le scope de la fonction est d'inclure un script php, pas de "vider" les variables précédemment définies dans l'index.

    Mais effectivement, les variables ne sont pas vidées, elles sont toujours existantes après l'inclusion de page.php, mais pas DANS page.php.

    Si j'ai bien compris, tout simplement parce que "page.php" est incluse au travers d'une fonction, sans lui passer ces variables en paramètres.

    Et donc "page.php" ne sait pas établir le lien entre la variable "truc" présente dans index.php avant inclusion et dans "page.php".

    Peut-être y a-t-il une solution de créer une sorte d'espace commun ou des pointeurs sur les variables communes ... ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    secured_include("page.php", "once", DEBUG);
    ca rend rien puisque tu renvoie une chaine

    si tu veux garder tes variables dans ta function fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extract($GLOBALS, EXTR_REFS);

    et tu peux faire direct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $content = ob_get_clean();


    sinon ton "once" ne sert pas, puisque que tu vérifie d'hab si il a déjà été inclus

  5. #5
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    merci

    je ne connaissais pas encore cette fonction ., et oui, bien vu pour le "once" :

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

Discussions similaires

  1. [68302][HDLC] Gestion des buffers incohérentes
    Par transgohan dans le forum Embarqué
    Réponses: 1
    Dernier message: 28/01/2015, 10h18
  2. Gestion des buffers dans une fonction
    Par JiJiJaco dans le forum Langage
    Réponses: 2
    Dernier message: 06/01/2006, 11h20
  3. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44
  4. Réponses: 4
    Dernier message: 04/07/2002, 12h31
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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