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 :

[Cookies] La fonction file_get_contents() et les sessions


Sujet :

Langage PHP

  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut [Cookies] La fonction file_get_contents() et les sessions
    Bonjour

    J'ai l'impression que la fonction file_get_contents() utilisée sur une URL n'utilise pas les données contenues dans la session présente.
    Ai-je raison, et dans ce cas, comment faire pour que la fonction utilise la session en cours ?
    Je pense passer par une variable en GET, mais c'est un peu bourrin, et j'aimerais mieux utiliser une autre solution.

    Merci d'avance

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Si vous souhaitez (ré)utiliser une session, il faut avec les fonctions fopen/file_get_contents, employer le quatrième paramètre (le contexte) de cette fonction pour spécifier les entêtes selon vos besoins. Des extensions comme cURL vous permettrait certainement de vous faciliter la tâche.

    Tout cela dépend de la configuration du serveur distant (transmission de l'identifiant par cookie et/ou par réécriture des URL et formulaires) et de ce que vous cherchez précisément à faire.

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci beaucoup pour la réponse, je ne connaissais pas les contextes.
    Par contre, j'ai beau regarder la documentation php, je ne vois pas comment insérer une session dans un contexte. Y a-t-il un moyen de transmettre les variables de session d'un seul coup, ou dois-je les passer en POST ?

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    La session n'existe que côté serveur à l'opposé d'un cookie. Par conséquent, c'est son identifiant que l'on transmet à chaque requête et non son contenu. Cela peut être fait par cookies (il y a une entête HTTP pour les cookies si je ne m'abuse) ou par la méthode GET ou POST suivant la configuration du serveur auquel vous vous adressez (voir les valeurs des directives session.use_cookies, session.use_only_cookies et session.use_trans_sid).

    Que cherchez-vous à faire exactement ? A consulter une page distante requérant au préalable l'ouverture d'une session sur ce serveur ?

  5. #5
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    En fait, j'ouvre par un script php plusieurs pages du même serveur, qui génèrent du contenu que je vais écrire dans des fichiers.
    L'objet de ce script est de pouvoir générer des fichiers imprimables sous excel (via xlhtml) de l'intranet consulté par l'utilisateur.

    Exemple : je consulte http://serveur/index.php?page=ensemble.php et j'obtiens un seul fichier excel contenant 3 onglets page1, page2 et page3. Ces pages sont également consultables sous la forme http://serveur/index.php?page=page1 (chacune des pages étant appelée par ensemble.php)

    Le serveur appelant et le serveur consulté sont donc le même dans mon cas, et les sessions contiennent les variables nécessaires à la consultation (page demandée, date, devise, etc).

    Si j'ai bien compris, en transmettant l'id de session, je vais pouvoir demander à la page d'utiliser la même session dans les 3 pages appelées.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par guidav
    Le serveur appelant et le serveur consulté sont donc le même dans mon cas, et les sessions contiennent les variables nécessaires à la consultation (page demandée, date, devise, etc).
    Une simple inclusion ne suffit pas en ce cas ?

    Citation Envoyé par guidav
    Si j'ai bien compris, en transmettant l'id de session, je vais pouvoir demander à la page d'utiliser la même session dans les 3 pages appelées.
    Oui c'est l'idée puisque les sessions fonctionnent ainsi et restent basées sur le serveur. C'est le seul moyen de retrouver votre session (et donc les informations qu'elle contient) entre chacun de vos appels (requête pour être précis, le protocole HTTP étant sans état).

  7. #7
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Citation Envoyé par julp
    Une simple inclusion ne suffit pas en ce cas ?
    Mon site fonctionne avec une seule page index.php, les pages contenant les données sont appelées par cette page sous la forme
    index.php?page=mapage.php
    Certaines données à exporter sont générées par index.php (données génériques) et d'autres (données spécifiques de l'état consulté) par mapage.php.
    Il faudrait donc pouvoir faire des inclusions avec des arguments, mais je crois que ce n'est pas possible.
    C'est la raison pour laquelle je me suis résolu à passer par des file_get_contents, qui ont l'avantage de réinitialiser bien proprement toutes mes variables de consultation lors de chaque requête.

    Merci beaucoup pour le coup de main, je pense que je vais pouvoir m'en sortir avec un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $sid = session_id();
    file_get_contents("<a href="http://serveur/index.php?page=$p&sid=$sid" target="_blank">http://serveur/index.php?page=$p&sid=$sid</a>");
    et sur la page index.php,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(isset($_GET['sid'])) {
      session_id($_GET['sid']);
     }

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Citation Envoyé par guidav
    Il faudrait donc pouvoir faire des inclusions avec des arguments, mais je crois que ce n'est pas possible.
    C'est la raison pour laquelle je me suis résolu à passer par des file_get_contents, qui ont l'avantage de réinitialiser bien proprement toutes mes variables de consultation lors de chaque requête.
    Oui c'est vrai on ne peut pas passer des arguments lors d'une inclusion. Cependant, il ne faut pas oublier que le script inclut aura accès aux variables que l'on a définit, par conséquent, on peut "simuler" cet aspect.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file_get_contents("http://serveur/index.php?page=$p&sid=$sid");
    Je pense que c'est un léger bug du forum, mais l'URL de la page suffira. Je vois, du fait que vous restez en local, vous avez simplifié ce passage de l'identifiant (attention tout de même aux éventuels problèmes de sécurité qui peuvent se poser mais ce facteur dépend en partie de la sensibilité de votre application. On en revient pour ainsi dire à une transmission avec session.use_trans_sid activée).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(isset($_GET['sid'])) {
      session_id($_GET['sid']);
     }
    Et le session_start après

  9. #9
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Merci, j'ai eu beau essayer, je n'ai pas réussi, alors j'ai triché un peu avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $exclude = array('contents', 'site', 'id', 'chart1', 'chart2', 'referer');
    reset($_SESSION);
    while (list($key, $val) = each($_SESSION)) {
       $myvars .= !in_array($key, $exclude) ? '&'.urlencode($key).'='.urlencode($val) : '';
    }
    reset($_SESSION);
    Je pense que ma session étant modifiée lors de l'appel de la page, il doit y avoir une boucle infinie quelque part.

    Merci du coup de main cependant, j'ai appris pas mal de choses.

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

Discussions similaires

  1. [Cookies] La fonction file_get_contents() et sessions
    Par AirOne70 dans le forum Langage
    Réponses: 1
    Dernier message: 02/03/2011, 10h32
  2. Réponses: 3
    Dernier message: 01/05/2006, 14h09
  3. Réponses: 5
    Dernier message: 22/03/2006, 14h54
  4. [Cookies] Problème avec les sessions PHP !!!
    Par boukay dans le forum Langage
    Réponses: 4
    Dernier message: 14/02/2006, 17h32
  5. [Cookies] newbie: Les sessions en PHP
    Par yoda_style dans le forum Langage
    Réponses: 12
    Dernier message: 20/01/2006, 20h49

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