Page 1 sur 1

variable de session problemes !!

Posté : 15 août 2007, 20:06
par Davee
Bonjour,

J'ai un petit problem avec les sessions

Je me suis aperçu que sur le serveur quand je consulte mon site les variables de session ne passent pas quand je n'accepte pas les coockies (par le navigateur).
Du coup je me demandais si je passais bien comme il faut ces variables.

Voilà comment je fais:

chaque début de fichier comprend un session_start()

ensuite si je veux passer une variable en $_SESSION :

$_SESSION['prout']=$mavar;

que ce soit un tableau ou une simple chaine peu importe.

pour récupérer la variable deux page plus loin (par exemple):

echo $_SESSION['prout'];
ou
$une_var=$_SESSION['prout'];

si les coockies ne sont pas acceptés par le navigateur, la $_SESSION n'est pas stocké.

ESt-ce que je passe bien mes variable de session??
Quel est le moyen de bien les passer ou y at-il un autre moyen???

Merci d'avance.

David.

Posté : 16 août 2007, 01:05
par Ryle
Voir la documentation sur les sessions, tu peux les passer soit par cookies, soit par l'url. Si les cookies sont désactivés la première méthode ne fonctionnera pas :)

http://fr2.php.net/manual/fr/ref.session.php
:arrow: Passer l'identifiant de session (session ID)

Posté : 16 août 2007, 08:34
par Davee
J'ai édité tout le post C'est mieux!

j'ai changer le mode opératoire je fais plus par laDB mais avec les fichiers.
Faut être un peu modeste et se dire que des fois C'est plus fort que toi. Mais ce n'est q'une question de temps.

J'ai donc ce code
<?php
require_once ('incphp/session_init.php');

$sess_save_path=session_save_path ('/tmp');
session_set_cookie_params (0, '/tmp/');

function open($save_path, $session_name)
{
    global $sess_save_path;
    $sess_save_path = $save_path;
    return(true);
}

function close()
{
    return(true);
}

function read($id)
{
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    return (string) file_get_contents($sess_file);
}

function write($id, $sess_data)
{
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    if ($fp = fopen($sess_file, "w+")) {
        $return = fwrite($fp, $sess_data);
        fclose($fp);
        return $return;
    } else {
        return(false);
    }

}

function destroy($id)
{
    global $sess_save_path;
    $sess_file = "$sess_save_path/sess_$id";
    return(unlink($sess_file));
}

function gc($maxlifetime)
{
    global $sess_save_path;
    foreach (glob("$sess_save_path/sess_*") as $filename) {
        if (filemtime($filename) + $maxlifetime < time()) {
            unlink($filename);
        }
    }
return true;
}

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");

session_start();

// Utilisez vos sessions comme d'habitude

$next=(isset($_GET['next']))? $_GET['next']: $next=0;

if ($next==0) {

	echo 'créer var sessions <br>'; 
        $CookieInfo = session_get_cookie_params();
	print_r ($CookieInfo);
 
	echo "<a href='http://$host/session1.php?next=1'>goaffichesession >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=2'>destroy >>>>></a>";

	$_SESSION['papate']='prout';
	$_SESSION['sesssavepath']=$sess_save_path .'gaga' ;
	$_SESSION['pouette']['pouta']='platatra';

	echo '<pre>';
	var_dump ($_ENV);
	echo '</pre>';

}else if ($next==1) {
	echo 'affiche sessions <br>';
	echo "<a href='http://$host/session1.php?next=0'>gocréésession >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=2'>destroysession >>>>></a>";
	
	echo '<pre>';
	var_dump ($_SESSION);
	var_dump ($_ENV);
	var_dump($sess_save_path);
	echo '</pre>';

}else if ($next==2) {
	echo 'détruit sessions <br>';
	echo "<a href='http://$host/session1.php?next=0'>go1 >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=1'>go2 >>>>></a>";
	session_destroy();
	
	echo '<pre>';
	var_dump ($_SESSION);
	var_dump ($_ENV);
	var_dump($sess_save_path);
	echo '</pre>';

}

?>
Je mets le fichier sur le server je créer un dossier tmp et je lance le script.

Voici les erreur.

Code : Tout sélectionner

Warning: file_get_contents() [function.file-get-contents]: Unable to access /tmp/sess_6256e7ddb1c904d32b949aac45dde9d6 in d:\www\edith-web.com\htdocs\session1.php on line 23 Warning: file_get_contents(/tmp/sess_6256e7ddb1c904d32b949aac45dde9d6) [function.file-get-contents]: failed to open stream: No such file or directory in d:\www\edith-web.com\htdocs\session1.php on line 23 Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at d:\www\edith-web.com\htdocs\session1.php:23) in d:\www\edith-web.com\htdocs\session1.php on line 60 Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at d:\www\edith-web.com\htdocs\session1.php:23) in d:\www\edith-web.com\htdocs\session1.php on line 60
Il ne trouve pas le fichier parcequ'il n'existe pas je sais pas pourquoi il ne le créé pas.

en local avec easy php ça marche bien.

Comprends pas ???? :?:

David.

Posté : 16 août 2007, 11:23
par Ryle
Mais les sessions ne se stockes pas dans la base les champs ne se remplissent pas.

Pour quelle raison ça ne marche pas
Peut être parce que tu ne fais jamais d'INSERT ? :)
Mais je vois vraiment pas ou tu veux en venir avec tout ça ? Si tu ne veux pas que tes sessions reposent sur un cookie, il te suffit de ballader le phpsessid d'url en url, je vois pas trop l'intérêt de jouer avec la bdd, m'enfin bon...

Posté : 16 août 2007, 11:44
par Davee
ha pardon ben j'ai rééditer le post croisement de post avec toi désolé.

Passer le PHPSEID d'url en url ... tu va me faire un noeud au cerveau.

Faut que je fasse fumer la cafetière parce que là je vois pas trop la méthode.

PHPSEID je vois .

pour l'INSERT oui alors ça c'est plutot juste.

Si je passe par les fichier ou par une table pour stocker les sessions c'est parce que je veux éviter les problem de script si les cookie sont refusés par le client.

Merci

David.

Posté : 16 août 2007, 12:09
par zeus
Il existe une configuration du serveur qui indique que pour porter le PHPSESSID (identifiant de la session) il faut utiliser un cookie, et si non disponible, le transmettre dans l'URL

En ce qui concerne le passage en base de donnée, sans avoir lu ton code, comment comptes-tu savoir, lorsqu'un utilisateur se connecte, quelles sont les informations qui lui sont liées ?
Ton problème se situe au niveau du passage de l'identifiant de session, c'est à dire l'identifiant qui permet de savoir quelle session est associé au visiteur, pas à l'endroit où sont stockées les informations liées.

En mettant en place ce stockage par base de données, tu ne fait que remplacer l'endroit de stockage mais tu ne résouts pas le problème du passage de l'identifiant :?

Posté : 16 août 2007, 13:50
par Davee
Bon ça fait déjà plusieurs fois qu'on me le dit alors, visiblement y a un truc que je pige pas.
Alors je vais essayer d'être intelligent :gla:
En ce qui concerne le passage en base de donnée, sans avoir lu ton code, comment comptes-tu savoir, lorsqu'un utilisateur se connecte, quelles sont les informations qui lui sont liées ?
Ton problème se situe au niveau du passage de l'identifiant de session, c'est à dire l'identifiant qui permet de savoir quelle session est associé au visiteur, pas à l'endroit où sont stockées les informations liées.
OK, bon j'ai une base données client avec des identifiants mot de passes et autre infos, quand il sont loggés ils ont acces à certaines pages notamment les panier, les infos du panier sont stockées dans la session.

ma session.name est PHPSESSID par default.

Alors question:

Si je récupère le PHPSESSID dans l'url par une page php

que j'utilise cette variable pour que le client se logge

puis que je renomme la session avec session_name ('N_session');

Est-ce que je peux éviter les problemes de blocages de cookies. ???

-- en nommant bien sure session_start('N_session') à chaque début de script --


Ou alors est-ce que les psychotiques qui bloquent les cookies sont suffisemment assez rare pour qu'on les ignore.

à ce moment là est-il possible au moins de détecter les cookieBloquer (= se dit d'une personne psychotique qui interdit arbitrairement les cookies sur son ordinateur de bureau),

je dit ça parce que il n'y à rien de plus embêtant que de tomber sur une page avec un message d'erreur php.

faudrait au moins une page html disant: vous êtes un psychotique arbitraire !!!
suivi d'un bouton: retournez à la page précédente.

Je tourne ça en comique mais si cette solution est possible je prends.

Merci d'avance pour vos réponses et aussi pour le temps que vous consacré à répondre à des questions bizarres. :wink:

David.

Posté : 16 août 2007, 14:02
par Ryle
Pour essayer de résumer un peu ce qui se passe.... lorsque tu démarres une session, php va créer pour l'utilisateur connecté un fichier temporaire dans son répertoire de session. Toutes les données que tu ajouteras en session seront écrites dans ce fichier, et de la même manière, si tu modifies ou supprimes une donnée, le fichier sera modifié en conséquence.

Donc toutes tes données sont conservées dedans, pas besoin de les stocker par ailleurs :)

Pour pouvoir identifier l'utilisateur et lui associer le bon fichier à chaque fois que celui-ci va demander une nouvelle page, php va essayer de lui coller un cookie avec l'identifiant de session permettant de savoir quel fichier il doit ouvrir pour cet utilisateur.

Si tu ne veux pas de ce système au cas ou certains utilisateur n'auraient pas activé les cookies (ou plutôt les auraient désactivés) c'est à toi de passer l'identifiant de session de page en page pour que php sache quel fichier ouvrir. Le plus simple pour cela est donc de l'ajouter dans chacune de tes url.



Pour savoir si un utilisateur autorise ou non les cookies, y a pas énormément de solution... faut lui en coller un et sur la page d'après vérifier qu'il existe toujours....

Posté : 16 août 2007, 14:42
par zeus
Sachant que, je le répète, il existe une configuration de PHP pour qu'il colle automatique le SID dans l'url si le cookie de session n'a pas pu être créé

Posté : 16 août 2007, 22:03
par Davee
Sachant que, je le répète, il existe une configuration de PHP pour qu'il colle automatique le SID dans l'url si le cookie de session n'a pas pu être créé
session.use_trans_sid
si tu parlais de ça zeus, ben j'ai regardé dans la config sur le server il est pas activé faut que je contact l'hébergeur pour activer. Je suis pas sure qu'il accepte.
Si tu ne veux pas de ce système au cas ou certains utilisateur n'auraient pas activé les cookies (ou plutôt les auraient désactivés) c'est à toi de passer l'identifiant de session de page en page pour que php sache quel fichier ouvrir. Le plus simple pour cela est donc de l'ajouter dans chacune de tes url.
J'ai compris, ... enfin je crois.

J'ai trouvé un petit truc mais c'est pas fini. dite mois si je suis sur la bonne voie. ça sert à rien mais on voit bien que l'identifiant de session est récupéré et un lien va chercher les infos du fichier de session sur le serveur .
<?php
require_once ('incphp/session_init.php');

session_name($id);
session_start();
$sess_save_path=session_save_path ();

//_________________________ BOUCLE VERIF IF URL ISSET BY GET ___________

if (!isset($_GET['id'])) {

		echo '<br>session_id if GET does not exists<br>';
		echo session_id();
		$id=session_id();

}else { 

		$id=$_GET['id'];
		echo "<br>session_id whenGET exist >>>$id<br>";
		echo session_id($id);
		echo '<br><br>'.$id.' : ceci est l\'id de départ<br>';

}
//_________________________ FIN DE BOUCLE ___________

//___________BOUCLE RECHARGE PAGE AVEC LES VAR DANS URL___________

$next=(isset($_GET['next']))? $_GET['next']: $next=0;

if ($next==0) {
	echo 'créer var sessions <br>'; 
	echo "<a href='http://$host/session1.php?next=1&id=$id'>go_Affiche session >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=2'>destroy >>>>></a>";

	$_SESSION['papate']='prout';
	$_SESSION['pouette']['poutu']='platazsrtuzrzrt';

	echo '<pre>';
	var_dump ($_SESSION);
	var_dump($sess_save_path);
	echo '</pre>';

}else if ($next==1) {
	echo 'affiche sessions <br>';
	echo "<a href='http://$host/session1.php?next=0&id=$id'>go_create_session >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=2'>destroy_session >>>>></a>";
	
	echo '<pre>';
	var_dump ($_SESSION);
	var_dump($sess_save_path);
	echo '</pre>';

}else if ($next==2) {
	echo 'détruit sessions <br>';
	echo "<a href='http://$host/session1.php?next=0&id=$id'>go1 >>>>></a><br>";
	echo "<a href='http://$host/session1.php?next=1&id=$id'>go2 >>>>></a>";
	session_destroy();
	
	echo '<pre>';
	var_dump ($_SESSION);
	var_dump($sess_save_path);
	echo '</pre>';
}
//_________________________ FIN DE BOUCLE  ___________

//__________ALLER CHERCHER LE FICHIER  SESS SUR LE SERVER ___________

$sess_file = "$sess_save_path/sess_$id";
echo '<br> sess_file : '.$sess_file.' <br>';
echo file_get_contents($sess_file);

echo '<br>session_name<br>'.session_name();
?>
Bon, c'est très rudimentaire, surtout que pour l'instant le résultat est une string ien difficile à traiter. je me demande bien quel fonction php pourra me formater ça en tableau.

David.