Page 1 sur 1

[resolu]Perte de session PHP lors de requete Ajax

Posté : 29 août 2009, 20:37
par arkhesis
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...


N.B. 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 à /.

N.N.B. la dernière fois que j'ai vu du code php, c'était il y a 5 ans, donc je suis débutant, mais en général je comprends assez vite... Ouais bon sauf là quoi...

Re: Perte de session PHP lors de requete Ajax

Posté : 30 août 2009, 11:17
par thehawk
regarde du coté de cette fonction : http://fr.php.net/manual/fr/function.session-id.php
ensuite tu passes en paramètre a ta page web distante
index.php?phpsession=2qsd4sqdsqdqsdqsd // Appel cet page
généré comme ceci :
echo 'index.php?phpsession='.session_id();

le bon session_id et tu le réinjecte
session_id($_GET['phpsession']);
Apres je ne sais pas si cela va marché, mais essayons ;)

Bye Hawk

Re: Perte de session PHP lors de requete Ajax

Posté : 31 août 2009, 00:40
par arkhesis
Salut, merci de ta réponse ^^

J'avais essayé avec PHPESSID + valeur de session_id() dans les paramètres du get.
J'ai aussi essayé de le mettre dans le set-cookie du header de la requete (dans un sens et après dans l'autre après avoir récupéré le paramètre dans le get).

Par contre j'ai fais tous mes essais avec PHPSESSID, je vais essayer avec phpsession comme nom de variable...
Ceci dit, dans mon phpinfo(), la configuration locale me dit: session.name PHPSESSID.

Re: Perte de session PHP lors de requete Ajax

Posté : 31 août 2009, 14:19
par arkhesis
Pour info:

Au début de mon index.php
<?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 : Tout sélectionner

<div>test: <?php echo $_SESSION['user']->id; ?></div>
Il y a bien test: 0

Si j'appelle une fonction affId():

Code : Tout sélectionner

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 : Tout sélectionner

<?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.

Re: Perte de session PHP lors de requete Ajax

Posté : 31 août 2009, 16:00
par arkhesis
Ah idée!
La classe il faut que je la déclare au début de chaque script php ou sur l'index ça suffit?
C'est peut être ça que j'ai oublié, non?

Re: Perte de session PHP lors de requete Ajax

Posté : 31 août 2009, 20:30
par arkhesis
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é... :/

Re: Perte de session PHP lors de requete Ajax

Posté : 01 sept. 2009, 11:21
par thehawk
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é... :/
Désolé je n'ai pas tout compris la.

Enfaite la session se communique bien entre les pages ?
Mais tu n'arrive pas a y acceder avec tes sessions ?

Au début d'un de tes scripts met un var_dump($_SESSION) voir ce que tu as dedans, à partir de la tu auras une idée du traitement a aporter. ;).

Si tu cherche a transmettre un objet via les session 'tel quel' avec les données et tout je te conseillerai de regarder ceci : http://fr.php.net/manual/fr/language.oo ... zation.php , avec un principe similaire mais avec la transmission par session.

Bye Hawk

Re: Perte de session PHP lors de requete Ajax

Posté : 01 sept. 2009, 11:41
par mere-teresa
Corrige moi si j'ai mal compris :
- tu veux utiliser les sessions (côté serveur, PHP)
- tu veux utiliser Ajax (côté client, Javascript, XMLHttpRequest, headers)
- tu veux mettre des objets en session (côté serveur PHP)

Pour le moment, tu arrives à utiliser Ajax, et les sessions mais sans le côté objet en session.
Mettre des objets en session, tu l'as bien compris,il faut inclure la déclaration de la classe avant le session_start() sinon l'objet ne se remonte pas. Si tu veux forcer un comportement particulier au remontage de l'objet (genre récupérer des infos en base de données), tu as le droit d'implémenter les méthodes __wakeup() et __sleep() qui seront appelées automatiquement à la mise en session.

Par ailleurs, quel navigateur utilises-tu pour tes tests ? Comment gère-t-il les cookies ? L'encodage des données ? Et le cache ?

Re: Perte de session PHP lors de requete Ajax

Posté : 02 sept. 2009, 11:24
par arkhesis
Si tu cherche a transmettre un objet via les session 'tel quel' avec les données et tout je te conseillerai de regarder ceci : http://fr.php.net/manual/fr/language.oo ... zation.php , avec un principe similaire mais avec la transmission par session.
Ouh merci!J'avais oublié ce petit détail. J'essayais de mettre l'objet en session non serialisé. C'est surement pour ça que je n'arrivais pas à le récupérer!
Je teste demain soir et je mets le post en résolu si ça marche.

merchi :)

Re: Perte de session PHP lors de requete Ajax

Posté : 02 sept. 2009, 11:29
par arkhesis
Corrige moi si j'ai mal compris :
- tu veux utiliser les sessions (côté serveur, PHP)


yep.

- tu veux utiliser Ajax (côté client, Javascript, XMLHttpRequest, headers)


yep

- tu veux mettre des objets en session (côté serveur PHP)


yep

Pour le moment, tu arrives à utiliser Ajax, et les sessions mais sans le côté objet en session.


yep

Mettre des objets en session, tu l'as bien compris,il faut inclure la déclaration de la classe avant le session_start() sinon l'objet ne se remonte pas.


vi, mais apparement ce n'est pas suffisant.
D'après le message de thehawk, il faut d'abord sérialiser (ce que je n'ai pas pensé à faire)

Par ailleurs, quel navigateur utilises-tu pour tes tests ?


firefox/firebug principalement.
Je ferai juste pour tester des tests sous chromium, arora, midori, epiphany, galleon, konqueror et IE. Mais je développe surtout avec firefox/firebug.

Comment gère-t-il les cookies ? L'encodage des données ? Et le cache ?
Pour le développement, j'ai désactivé le cache.
J'ai gardé le comportement par défaut pour les cookies et l'encodage.