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 :

Perte de session lors de requête AJAX


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut Perte de session lors de requête AJAX
    Bonjour,

    J'ai un petit problème et à force de plancher dessus je commence à m'arracher les cheveux. Comme je vais finir par ne plus en avoir, je viens poser la question histoire d'arracher les cheveux des autres :p.

    Contexte: Ubuntu - apache - php - prototype.js (et mysql mais on s'en fout).

    Fonctionalité qui merde:
    Page php -> objet en session -> requete ajax vers autre PHP -> retour de valeur
    (contenue dans la session php, vu que je teste ça. Ca a l'air de ne servir à rien, mais je m'en sers par la suite pour savoir ce que je dois chercher en base comme données à afficher à l'utilisateur).

    Etat initial (de tout naif quand je pensais que ça marchait tout seul):

    - session_start();
    - mise en session des valeurs par défaut (compte invité, la donnée s'affiche plus bas dans une div si je veux vérifier).
    - sur click -> requete ajax vers un script php (qui pour ce test, renvoit juste la valeur mise en session)
    - Ledit script fait un echo de la valeur (là j'ai déjà perdu la session je pense).
    - Aucune valeur récupérée en retour.

    Correction 1:
    - Rajout de session_start(); au début du script php distant (mais ça ne marche toujours pas).

    Correction 2 (là ça part en vrille de plus en plus):
    - sauvegarde du session id dans une variable globale javascript
    - requestHeaders: ['Set-Cookie', 'PHPSESSID=' + sid],
    Dans ma requete je vois bien (firebug) le Set-Cookie avec la bonne valeur, mais ça ne marche toujours pas. (note, le phpessid de la réponse est différente)

    Correction 3 (aussi nommée: "je m'enfonce"):
    - idem que 2, mais je passe le phpessid aussi en paramètre, puis je:
    - $sid = $_GET['sid']; header("Set-Cookie: PHPSESSID=".$sid);
    Le set-cookie est bon dans les 2 sens mais ça ne marche toujours pas, toujours pas accès à ma session...

    Corrections 4... 5... 6... etc (aussi nommé "le titanic")
    -A partir de là j'ai tenté des trucs plus ou moins débiles ou loufoques, mais on va avoir la clémence de ne pas le mentionner. L'arrachage de cheveux commence et je suis bloqué...


    Un peu d'aide pour un naufragé s'il vous plait?
    La je bloque complètement...


    EDIT: ma variable session.cookie_path du php.ini est de base à /, ça m'a intrigué et je l'ai mise à /var/www/sessions (en créant le répertoire sessions) mais comme ça ne changeait rien, je l'ai remise à /.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 54
    Points : 45
    Points
    45
    Par défaut
    Appliques ce qui est décrit ici http://bob.developpez.com/phpauth/ et tu tapes ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    include "templates/authcheck.php"
    au tout debut de chacun tes fichiers php et tu ne devrait plus perdre ta session.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Tout d'abord merci de ta réponse. ^^

    Mais euhhhh, c'est à dire qu'à part les "submit" et les "header('Location:" c'est déjà ce que je fais :/
    (remplacées par des requêtes ajax, en "get" par contre, il faut remplacer par des "post" pour garder la session?)

    Par contre, je n'avais pas fais de détection d'IP ni de timeout de session, ça va me servir ^^ (même si le problème ne vient pas de là :/)

    Niveau structure, j'ai une seule grosse page index.php, alimentée par des require_once et par des appels ajax vers d'autres php. (et ce sont au niveau de ces appels que ma session se brouille probablement, comme si je ne transférais pas ma session aux fichiers php que j'appelle via ajax, malgré leur session_start() (et éventuemment le set-cookie phpessid=truc que je passe dans le header de la requete).

    Je vais éditer ce message avec du code pour bien illustrer cela je crois.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Au début de mon 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
    <?php 
    session_start();
    class gens {
    	var $id;
    	var $nom;
    	var $groupe; 
    	var $mail; 
    	var $titre; 
    	var $avatar;
      }
    if (!isset($_SESSION['user'])) {
    	$_SESSION['user'] = new gens();
    	$_SESSION['user']->id = 0;
    	$_SESSION['user']->nom = 'Invité';
    	$_SESSION['user']->groupe = 0;
    }
     
    ?>
    N.B. Quand j'authentifie la personne, les valeurs de l'objet sont remplies avec ses valeurs. Non connecté, il a une sorte de compte invité à droits restreints.

    Toujours dans index.php, si je mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <div>test: <?php echo $_SESSION['user']->id; ?></div>
    Il y a bien test: 0

    Si j'appelle une fonction affId():
    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
    function affId() {
    	new Ajax.Request(
    			'affId.php',
    			{
    				method: 'get',
    				requestHeaders: ['Set-Cookie', 'PHPSESSID=' + sid],
    				parameters: {'sid': sid},
    				onComplete: gestionReponseAffId
    			}
    		);
    }
     
    function gestionReponseAffId(xhr) {
    	$('aff').innerHTML = xhr.responseText;
    }
    sid contenant le phpessid (vérifié), mais j'ai essayant sans le parameters et sans le resquest headers, dans tous les cas, aucune différence.

    le affId.php contenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    	session_start();
    	$sid = $_GET['sid'];
    	header("Set-Cookie: PHPSESSID=".$sid);
    	echo $sid."ID: ".$_SESSION['user']->id;
    ?>
    Ca me renvoit bien le sid, mais pas le $_SESSION['user']->id.
    J'ai essayé, sans le get du sid et sans le header set-cookie, ca ne marche pas mieux.


    Et tant que ce mécanisme de session ne veut pas fonctionner, je suis bloqué.
    Mes requetes en base étant conditionnées par exemple par le groupe de l'utilisateur ou son id, et j'aimerais garder en session plutot que tout passer en javascript et en clair.

  5. #5
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 838
    Points
    2 838
    Par défaut
    Que veux-tu faire avec cet ID_SESSION ? Pourquoi le passes-tu par l'URL ?

    Ce qu'il se passe à mon avis, c'est que tu reset le session_id() et donc la session n'existe pas, ou pire p-e t'es tu emmêlé les pattes dans ton code et tu t'es trompé entre sid & id

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    J'ai commencé en essayant sans et ça ne marche pas non plus.
    Mais aujourd'hui en y repensant (comme quoi c'est pas mal d'exposer son problème, ça aide à réfléchir soi même), j'ai une idée que je vais tester ce soir.

    La classe gens n'est déclarée QUE dans index.php... Ce n'est peut être pas la session qui est en cause mais mon objet... Enfin peut être... Enfin je vais tester ce soir.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 7
    Points : 2
    Points
    2
    Par défaut
    Oui c'est ça... Enfin j'ai pas réussi à corriger, mais si j'enlève la notion d'objet (et que je mets chaque variable indépendament en session), ça marche...

    Pourtant j'ai essayé en déclarant la classe dans un require_once au dessus de chaque php utilisé... :/

Discussions similaires

  1. [PHP 5.3] Perte de session PHP lors de requete Ajax
    Par touness dans le forum Langage
    Réponses: 3
    Dernier message: 21/03/2012, 14h06
  2. [AJAX] appel AJAX lors d'une perte de session
    Par CocoLeNain dans le forum AJAX
    Réponses: 0
    Dernier message: 31/05/2010, 21h35
  3. Perte de session lors du 1er affichage
    Par messier79 dans le forum Langage
    Réponses: 1
    Dernier message: 22/08/2007, 15h26
  4. Réponses: 5
    Dernier message: 12/09/2006, 00h01
  5. [MySQL] Perte d'information lors d'une requête de visualisation
    Par niccco dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 21/10/2005, 13h46

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