Peut-on abuser des variables de sessions?

Peut-on abuser des variables de sessions? - PHP - Programmation

Marsh Posté le 01-04-2004 à 22:18:16    

Sommes nous limités sur l'utilisations des variables de sessions et sur le nombre de variables, de taille des données que l'ont peut transmettre par ce moyen la?.
 
les avantages et inconvenients des variables de sessions?
 
quels sont les bonne methodes de transmissions de variables d'une page à une autre?
 
les avantages et les defaut de chacunes de ces methodes?
 
meme question pour les variables globals de type $_POST ou $_GET
 
es-ce mauvais d'abuser des  

Code :
  1. <button type=hidden>


 
pour transmettre des variables d'une page a une autre?
 
et pour finir
 
comment faites vous pour passer vos variables (vos valeurs) surtt pour des traitements qui demande beaucoup de valeurs a transferer?
 
et quelqu'un a t-il deja rencontré des probleme d'icompatibilité dans sont site du au changement de $_SESSION et $SESSION_POST_VAR  
ou $_POST et $HTTP_POST_VAR  
puis  "global"  
je trouve que tt ca fini par m'embrouiller un peu le cerveau des fois, peut etre qu'il m'en faut pas bcp mais bon  ;)
Les changements de norme dans un langage complique pas mal l'existence des developpeur et de la maintennace de leur application  :D  
 
enfin voila  
 
dites tous ce que vous avez a dire sur le passage de variables de page en page , foncez
 
ca m'aiderai bien  :D  
 
(peut etre devrais je changer le sujet?  :??:  )  ;)

Reply

Marsh Posté le 01-04-2004 à 22:18:16   

Reply

Marsh Posté le 01-04-2004 à 23:54:47    

les type=hidden, t'as intérêt à les revérifier à chaque fois parce qu'un petit malin pourrait en profiter pour y glisser des trucs pas bien.
 
Pour les sessions, je dirais que ça dépend si t'en attends beaucoup ou peu. Si c'est peu, abuse, sinon, utilise les type=hidden, ça alourdit un poil la requête mais c'est pas la mort à mon avis.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 02-04-2004 à 00:19:39    

Citation :

Sommes nous limités sur l'utilisations des variables de sessions et sur le nombre de variables, de taille des données que l'ont peut transmettre par ce moyen la?.


 
Techniquement oui, les sessions doivent bien être sauvegardée quelque part (fichier ou db en général), donc tu as une limite théorique liées au serveur. Pratiquement, il faut y aller pour l'atteindre...

Citation :

les avantages et inconvenients des variables de sessions?


Les + :
Personnalisation réelle
Meilleure sécurité que les cookies par exemple (stockage sur le serveur, pas chez le client)
Les - :
Durée de vie très brève
Le GC a intérêt à bien faire son boulot, surtout si le serveur est short en espace disque
 

Citation :

quels sont les bonne methodes de transmissions de variables d'une page à une autre?


 
Y a pas de bonnes ou mauvaises méthodes, juste des méthodes plus ou moins adaptées suivant les cas
 

Citation :

les avantages et les defaut de chacunes de ces methodes? meme question pour les variables globals de type $_POST ou $_GET


 
Je fusionne les deux réponses :D
Je vois 5 grosses méthodes de transmission (mais il est tard :D) :
 

  • Cookies :

C'est la méthode pourrie par excellence, désactivable, hébergé chez le client entre autres défauts majeurs. Permets plus d'indentifier une machine qu'un utilisateur

  • Formulaire via champs caché :

Pas beaucoup plus sécuritaire que les cookies, les données sont dispo en clair dans le code client et peuvent y être modifiées. Nécessite aussi l'intervention de l'utilisateur pour la transmission (ou le jscript, lui aussi désactivable), bref...

  • dans l'url via la query string :

Là, c'est clairement un passage visible, donc à réserver à des données non sensibles (à moins de coder/décoder aux deux extrémités), ça encourage les essais de l'utilisateur (qui tape des QS avec des valeurs "hors cadre" ), bref, ça demande des contrôles d'erreurs avant traitement.

  • les sessions :

déjà dit plus haut, deux trucs qui manquent pour moi à php, c'est les sessions globales (session commune à tous les utilisateurs et chargée quelque soit le point d'entrée sur le site) et une meilleure gestion de la portée des sessions

  • les caches :

Bon, là je sors un peu du sujet, parce que c'est pas tant une méthode pour passer des variables propres à un utilisateur d'un page à l'autre qu'une réponse aux trucs qui manquent que je cite plus haut =)
 

Citation :

es-ce mauvais d'abuser des  

Code :
  1. <button type=hidden>


 
pour transmettre des variables d'une page a une autre?


 
Oui, la syntaxe étant fausse :D
 

Citation :

comment faites vous pour passer vos variables (vos valeurs) surtt pour des traitements qui demande beaucoup de valeurs a transferer?


 
Comme dit plus haut, ça dépend beaucoup trop du cas pour dire je fais toujours comme ça. Souvent, c'est session et cache
 

Citation :

et quelqu'un a t-il deja rencontré des probleme d'icompatibilité dans sont site du au changement de $_SESSION et $SESSION_POST_VAR  
ou $_POST et $HTTP_POST_VAR  
puis  "global"  


 
Non, j'utilise que les formes courtes :D

Reply

Marsh Posté le 02-04-2004 à 00:39:09    

deja c quoi excatement cette faille des  type hiden? ;)
 
 
qu'es vous appeller peu de variables de sessions?
 
admetons que je fais passer environ 10 tableau de plus de 300 élements  chacuns (1element = environ 1 a 80 caractères)
es-ce lourd en session? en hidden? et en cache?
 
naceroth: qu'es t'appelle cache?
 
bon alors si par exemple j'utilise les variables de sessions pour les mots de passes et code clients etc... et que j'utilise les formulaires cachés pour mes formulaires de commandes de produits (code produit , tarifs , quantité etc..) alors je ne suis pas trop un bourrin ?
 
PS : mais des fois ca peu m'arriver de passer bcp d'element par varaibles de session  
 
en fait sur ma 1er page de commande je fais pas mal de requetes et j'affiche le formulaire de comande mais ensuite pour l'affichage du recapitulatif de la commande je transmet tt par formulaire caché ou session  pour eviter de refaire des requettes
 
ais-je tord?
 
bon allé faut que j'aille faire dodo quand meme  ;o)
 
bonne nuit j'attend vos réponses merci d'avancee ;)
puis les cookies j'evite aussi en general , j'aime pas ca non plus  ;o)


Message édité par saxgard le 02-04-2004 à 00:41:18
Reply

Marsh Posté le 02-04-2004 à 00:48:14    

Les sessions, c'est très bien mangez z'en !
C'est mieux que les hiddens, sauf si tu as besoin des hidden en question en JavaScript par exemple...
 
Mais y'a rarement besoin de charger les sessions avec des tonnes d'infos.
En réfléchissant un peu, en session, on ne trouve que des infos fourni par l'utilisateur qu'on garde d'une page à une autre avant validation finale. Genre une transaction quoi :D
Parce-que si c'est pour y mettre des infos qui sont dispo dans une BD ou des fichiers, ben, c'est OK pour des données simples, mais quand ça devient gros, il est temps de se demander s'il ne vaut pas mieux conserver que quelques IDs...
Sinon, y'a les infos de gestion valables tout le temps de la connexion d'un utilisateur identifié. Par exemple une liste de ses droits si il est coûteux de la regénérer à chaque requête HTTP...
 
RMQ : Rien à voir avec PHP en particulier la question !
Le problème se pose pour toute appli WEB :D

Reply

Marsh Posté le 02-04-2004 à 01:44:41    

saxgard a écrit :


naceroth: qu'es t'appelle cache?


 
Dans le cas présent, des fichiers contenant des données (des tableaux en général) linéarisées.
 
Dans les cas les plus extrèmes (genre tes 10 tableaux de 300 éléments :)), je préfères créer un fichier avec un nom aléatoire (basé sur le SID par exemple) et ne transmettre par $_SESSION que le nom du fichier à lire à chaque page plutôt que l'intégralité des données qui ne seront peut être utilisées qu'à la dixième page :)

Reply

Marsh Posté le 02-04-2004 à 09:09:04    

naceroth a écrit :


 
Dans le cas présent, des fichiers contenant des données (des tableaux en général) linéarisées.
 
Dans les cas les plus extrèmes (genre tes 10 tableaux de 300 éléments :)), je préfères créer un fichier avec un nom aléatoire (basé sur le SID par exemple) et ne transmettre par $_SESSION que le nom du fichier à lire à chaque page plutôt que l'intégralité des données qui ne seront peut être utilisées qu'à la dixième page :)


 
pour resumer je linearise mes tableaux je les mets dans un fichiers nommé par le SID (que je ne sais aps coment obtebir  ;) )
puis dans ma variable de session je garde le nom du fichier . c bien ca?
 
mais comment ton fichier se supprime a la cloture de la session?


Message édité par saxgard le 02-04-2004 à 11:07:07
Reply

Marsh Posté le 02-04-2004 à 09:11:35    

Mara's dad a écrit :

Les sessions, c'est très bien mangez z'en !
C'est mieux que les hiddens, sauf si tu as besoin des hidden en question en JavaScript par exemple...
 
Mais y'a rarement besoin de charger les sessions avec des tonnes d'infos.
En réfléchissant un peu, en session, on ne trouve que des infos fourni par l'utilisateur qu'on garde d'une page à une autre avant validation finale. Genre une transaction quoi :D
Parce-que si c'est pour y mettre des infos qui sont dispo dans une BD ou des fichiers, ben, c'est OK pour des données simples, mais quand ça devient gros, il est temps de se demander s'il ne vaut pas mieux conserver que quelques IDs...
Sinon, y'a les infos de gestion valables tout le temps de la connexion d'un utilisateur identifié. Par exemple une liste de ses droits si il est coûteux de la regénérer à chaque requête HTTP...
 
RMQ : Rien à voir avec PHP en particulier la question !
Le problème se pose pour toute appli WEB :D


 
c'est vrai aussi que peut etre des fois vaudrait peut etre mieux que je refasse executer des requetes et en gardant juste dans mes variables de session des ID  
 
ttca des fois je trouve que c un vrai casse tete pour savoir quelle moyen utilisé pour les passages de varaibles  . j'espère que c pas que moiq ui est ce genre de casse tete   :D


Message édité par saxgard le 02-04-2004 à 11:05:18
Reply

Marsh Posté le 02-04-2004 à 11:07:14    

pti up

Reply

Marsh Posté le 02-04-2004 à 12:36:06    

saxgard a écrit :


 
c'est vrai aussi que peut etre des fois vaudrait peut etre mieux que je refasse executer des requetes et en gardant juste dans mes variables de session des ID  
 
ttca des fois je trouve que c un vrai casse tete pour savoir quelle moyen utilisé pour les passages de varaibles  . j'espère que c pas que moiq ui est ce genre de casse tete   :D


 
explique nous vite fait le fonctionnement global de l'appli, peut-être qu'il y'aura une solution plus simple et performante que ce que tu envisage de faire ? :)

Reply

Marsh Posté le 02-04-2004 à 12:36:06   

Reply

Marsh Posté le 02-04-2004 à 12:51:38    

aspegic500mg a écrit :


 
explique nous vite fait le fonctionnement global de l'appli, peut-être qu'il y'aura une solution plus simple et performante que ce que tu envisage de faire ? :)  


 
alors ca se decompose en 5 partie  ;o)
 
1) page  login  (authentification)
2) formulaire de tous les produits que l'on peu commander  ( le seul champ que l'on rempli c la quantité
3) recapitumatif de la commande , on voit uniquement les produits que l'on a commandé (presentaion du tarif hors taxe , frais de port etc..)
4) confirmation et enregistrement de la commande
5) version imprimable du bon de comande
ces 5 parties correspondent a des apelels de 5 pages (identiques ou non mais 5 chargements de pages)
 
voila. La gestion du paiment en ligne et la livraion ce fait en interne, pas sur le net
 
je sais pas si deja ca resume un peu mon appli
 
en gros je passe par session mon athentification
 
ensuite pour passer de mon formulaire(2) a mon recapitulatif , je transmet tt ce qui est cod produit , quantité , prix , remise etc.. par formulaire caché  (button caché) , tt ca pour eviter de refaire des requtes a nouveau sur la base et alléger les lignes de code
 
ensuite je repasse ces memes valeurs  (par formulaire caché) sur la partie (3) confirmation de la commande et enregistrement
 
et je repasse ces memes valeurs par formulaires caché au bon de commande imprimable
 
en gros je passe  3 fois les mmes valeurs par formulaire cachés
 
je sais pas si je suis assez clair , je ne sais pas trop quoi donner comme precision supplementaire
 
si ta besoin d'autre info pour que ca soit plus clair n'hesite pas a demander  :)

Reply

Marsh Posté le 02-04-2004 à 12:59:46    

saxgard a écrit :


 
alors ca se decompose en 5 partie  ;o)
 
1) page  login  (authentification)
2) formulaire de tous les produits que l'on peu commander  ( le seul champ que l'on rempli c la quantité
3) recapitumatif de la commande , on voit uniquement les produits que l'on a commandé (presentaion du tarif hors taxe , frais de port etc..)
4) confirmation et enregistrement de la commande
5) version imprimable du bon de comande
ces 5 parties correspondent a des apelels de 5 pages (identiques ou non mais 5 chargements de pages)
 
voila. La gestion du paiment en ligne et la livraion ce fait en interne, pas sur le net
 
je sais pas si deja ca resume un peu mon appli
 
en gros je passe par session mon athentification
 
ensuite pour passer de mon formulaire(2) a mon recapitulatif , je transmet tt ce qui est cod produit , quantité , prix , remise etc.. par formulaire caché  (button caché) , tt ca pour eviter de refaire des requtes a nouveau sur la base et alléger les lignes de code
 
ensuite je repasse ces memes valeurs  (par formulaire caché) sur la partie (3) confirmation de la commande et enregistrement
 
et je repasse ces memes valeurs par formulaires caché au bon de commande imprimable
 
en gros je passe  3 fois les mmes valeurs par formulaire cachés
 
je sais pas si je suis assez clair , je ne sais pas trop quoi donner comme precision supplementaire
 
si ta besoin d'autre info pour que ca soit plus clair n'hesite pas a demander  :)  


 
Je viens de terminer un projet similaire (mais plus gros et plus poussé :kaola:  :D ), et franchement en session à part l'authentification, je passe un tableau multi contenant les id des produits commandés, avec à coté leurs couleurs et tailles choisies, aprés le panier se démerde avec ca et la bdd pour trouver les infos et faire le calcul, c'est beaucoup plus simple, le client ne va pas voir son panier toutes les 2s ;)

Reply

Marsh Posté le 02-04-2004 à 13:18:25    

aspegic500mg a écrit :


 
Je viens de terminer un projet similaire (mais plus gros et plus poussé :kaola:  :D ), et franchement en session à part l'authentification, je passe un tableau multi contenant les id des produits commandés, avec à coté leurs couleurs et tailles choisies, aprés le panier se démerde avec ca et la bdd pour trouver les infos et faire le calcul, c'est beaucoup plus simple, le client ne va pas voir son panier toutes les 2s ;)  


 
 :D  
 
oauis c vrai mais mon gros probleme ca a était le temps pour le faire, j'ai du faire ca en  5 jours avec recuperation des produits present sur un catalogue gerer avec oscommerce. enfin bon la merde  :)  
 
et la c vrai que si j'ai un tt petit peu de temps je voudrait me pencher sur l'optimisation du code
 
-passage de variable
- CSS
etc..
 
 :)


Message édité par saxgard le 02-04-2004 à 13:19:16
Reply

Marsh Posté le 02-04-2004 à 13:31:42    

saxgard a écrit :


 
 :D  
 
oauis c vrai mais mon gros probleme ca a était le temps pour le faire, j'ai du faire ca en  5 jours avec recuperation des produits present sur un catalogue gerer avec oscommerce. enfin bon la merde  :)  
 
et la c vrai que si j'ai un tt petit peu de temps je voudrait me pencher sur l'optimisation du code
 
-passage de variable
- CSS
etc..
 
 :)


 
Y'a deja tout ce qu'il faut dans oscommerce, pourquoi refaire un systeme :heink:

Reply

Marsh Posté le 02-04-2004 à 13:51:59    

aspegic500mg a écrit :


 
Y'a deja tout ce qu'il faut dans oscommerce, pourquoi refaire un systeme :heink:  


 
parceque deja on ne veut pas le paiment et la livraion ensuite la facon dont on ma demander d'incorporer les produits dans oscommerce ne me permet plus d'utiliser le systeme de commnde d'oscommerce  
 
puis ensuite c pour des commande de gros clients  donc faut du rapide en peu de clique  
 
et ensuite la gestion et les bases et pour les mises a jour etc... bin oscommerce n'etait pas simple dans notre cas
 
mais bon le plus gros pb etait la livraion et le paiment que l'on ne voulait pas et qui était difficil a completement degager d'oscommerce mais surtt le probleme etait la facon dont on presente les produits sur le catalogue qui nous permet pas la commande direct a partir d'oscommerce  
 
et pour finir et comme je l'ai dit c'ets pas pour des commandes grand public
 
enfin voila en gros les raisons
 
et puis aussi on veut du tres rapide
et des fois modifier un truc qu'on connait pas bien bin ca prend plus de temps
 
voilou
 
 ;)  

Reply

Marsh Posté le 02-04-2004 à 16:08:51    

saxgard a écrit :


 
parceque deja on ne veut pas le paiment et la livraion ensuite la facon dont on ma demander d'incorporer les produits dans oscommerce ne me permet plus d'utiliser le systeme de commnde d'oscommerce  
 
puis ensuite c pour des commande de gros clients  donc faut du rapide en peu de clique  
 
et ensuite la gestion et les bases et pour les mises a jour etc... bin oscommerce n'etait pas simple dans notre cas
 
mais bon le plus gros pb etait la livraion et le paiment que l'on ne voulait pas et qui était difficil a completement degager d'oscommerce mais surtt le probleme etait la facon dont on presente les produits sur le catalogue qui nous permet pas la commande direct a partir d'oscommerce  
 
et pour finir et comme je l'ai dit c'ets pas pour des commandes grand public
 
enfin voila en gros les raisons
 
et puis aussi on veut du tres rapide
et des fois modifier un truc qu'on connait pas bien bin ca prend plus de temps
 
voilou
 
 ;)  
 


 
Ce que tu veux ca ressemble exactement à mon projet :D
 
Dans ton cas t'aurais dû refaire le catalogue, c'est peut-être plus rapide que de repomper des morceaux d'oscommerce :pt1cable:

Reply

Marsh Posté le 02-04-2004 à 16:54:21    

saxgard a écrit :


 
pour resumer je linearise mes tableaux je les mets dans un fichiers nommé par le SID (que je ne sais aps coment obtebir  ;) )
puis dans ma variable de session je garde le nom du fichier . c bien ca?
 
mais comment ton fichier se supprime a la cloture de la session?


 
en gros oui, c'est ça :)
 
Pour la suppresion, c'est la limite du système, pas de GC donc c'est au script (ou à un script d'admin) lui-même de faire le travail. Ceci dit, comme je vide de toutes manières les grosses variables de sessions une fois que j'en ai fini avec elles (sont pas nombreuses les données que tu gardes d'un bout à l'autre de la session :D), supprimer une session ou un fichier, c'est choux vert et vert choux :)

Reply

Marsh Posté le 05-04-2004 à 13:11:03    

aspegic500mg a écrit :


 
Ce que tu veux ca ressemble exactement à mon projet :D
 
Dans ton cas t'aurais dû refaire le catalogue, c'est peut-être plus rapide que de repomper des morceaux d'oscommerce :pt1cable:  


 
ouais c clair, si ca ne tenais que de moi j'aurais refais un mini catalogue, surtout que je n'avais pas besoin de la complexité d'oscommerce, mais bon ils ont voulu quelque chose de tres rapide , et mon chef me la un peu imposer et enfin de compte a cause de ca on c trouvé un peu ds la merde ;)

Reply

Marsh Posté le 05-04-2004 à 13:13:43    

naceroth a écrit :


 
en gros oui, c'est ça :)
 
Pour la suppresion, c'est la limite du système, pas de GC donc c'est au script (ou à un script d'admin) lui-même de faire le travail. Ceci dit, comme je vide de toutes manières les grosses variables de sessions une fois que j'en ai fini avec elles (sont pas nombreuses les données que tu gardes d'un bout à l'autre de la session :D), supprimer une session ou un fichier, c'est choux vert et vert choux :)


 
euh c quoi un GC? ;)
 
bin ce que je comprend pas c'est que, si tu supprime tes variables de sessions c'est pas pour autant que tu supprimes ton fichier (cache)?
et pour ca faudrait faire un truc qui supprime les fichiers une fois de temps en temps, ou faire ca a la main.
 
ou alors faudrait quelquechose qui detecte la fin de session et qui supprime le fichier.
 
 :D


Message édité par saxgard le 05-04-2004 à 13:14:31
Reply

Marsh Posté le 05-04-2004 à 13:49:59    

GC : Garbage collector
C'est justement le process qui fait le ménage dans les vielles sessions.
 
Pour les sessions, je préfère utiliser une BD...
 
Edit :  
Détection de fin de session : Impossible sauf avec un lien/bouton "déconnexion" dont on ne peux jamais être certain qu'il sera utilisé.
Un gestionnaire de session fonctionne donc de la manière suivante :
A chaque connexion (voir plus loin) on supprime les sessions non mise à jour depuis un temps paramétrable (généralement autour de 20 minutes).
Plus loin : En fait ce process de supresssion n'est pas lancé systématique. Un paramètre permet de fixer une probabilité de lancement du GC.
 
Sinon, supprimer les variables de session ça sert à limiter le nombre et le volume de variable à charger à chaque page :D


Message édité par Mara's dad le 05-04-2004 à 13:59:27

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-04-2004 à 14:08:07    

bon le GC c ce qui regarde si les  variables de sessions etc... sont toujours utilisés , on peu regler ca frequence de controle dans php.ini
 
mais c pas ca qui va permettre de supprimer le fichier si la sessions est fermer , enfin si j'ai bien compris  ;)
 
et le probleme serait le meme si je stock dans une BdD au lieu d'un fichier
 :)  
 
mais peut etre je ne comprend pas trop, je suis un peu novice dans ce domaine


Message édité par saxgard le 05-04-2004 à 14:09:29
Reply

Marsh Posté le 05-04-2004 à 17:02:14    

saxgard a écrit :


mais peut etre je ne comprend pas trop


C'est tout à fait ça :D

saxgard a écrit :


je suis un peu novice dans ce domaine


Ca doit être pour ça...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 05-04-2004 à 17:03:43    

saxgard a écrit :


bin ce que je comprend pas c'est que, si tu supprime tes variables de sessions c'est pas pour autant que tu supprimes ton fichier (cache)?
et pour ca faudrait faire un truc qui supprime les fichiers une fois de temps en temps, ou faire ca a la main.


 
Ah mais si, si ton tableau de cache est vide, tu peux parfaitement supprimer le fichier correspondant dans le script. Ca gêne pas, si ton utilisateur réutilise un cache par la suite, et bien le fichier est recréé.
 
Mais dans tous les cas, tu peux (dois) coder ton propre GC qui fait le ménage dans les fichiers oui (à chaque connexion à la partie d'administration d'un site par exemple, pour ceux qui sont assez mis à jour :D)
 
Pour le stockage en db, j'utilise pas (vu que je fais tout pour utiliser le moins possible les db :D), mais j'ai déjà vu des classes qui utilisaient de db pour stocker les variables de sessions, et qui possédaient leur propre GC à charger soit même dans un script quelconque :)
 
Et comme le dit Mara's dad, la suppression des variables de session, c'est juste pour éviter d'alourdir un script avec des tonnes d'infos qui vont plus servir à rien.

Reply

Marsh Posté le 06-04-2004 à 01:56:14    

Un exemple brut de décofrage (sorti tout droit d'un projet) pour PostGreSql...
 

<?php
/*--------------------------------------------------------------------------------------------//
 
   Gestionnaire de session utilisant la base postgres pour la persistance des données.
 
//--------------------------------------------------------------------------------------------*/
 
/* Lecture du nom de la table contenant les sessions. Par défaut 'php_sessions'. */
$pgsql_session_table = ini_get( 'session.save_path' );
if( empty( $pgsql_session_table ) )
{
   $pgsql_session_table = 'php_sessions';
}
 
/* Lecture de la durée de vie d'une session. */
$pgsql_session_maxlifetime = $SESSION_LIFE_TIME[ $USER_ENV ];
 
/* Global PostgreSQL database connection handle. */
$pgsql_session_handle = false;
 
/**
* Opens a new session.
*
* @param $save_path    The value of session.save_path.
* @param $session_name The name of the session ('PHPSESSID').
*
* @return  boolean     True on success, false on failure.
*/
function pgsql_session_open($save_path, $session_name)
{
   global $pgsql_session_handle;
 
   if( $pgsql_session_handle = @pg_pconnect( DB_WEB ) )
   {
       return( true );
   }
   else
   {
       session_error( "Impossible de se connecter à : '" . DB_WEB . "'", true );
   }
}
 
/**
* Closes the current session.
*
* @return  boolean     True on success, false on failure.
*/
function pgsql_session_close()
{
   global $pgsql_session_handle;
 
   if( $pgsql_session_handle )
   {
       return @pg_close( $pgsql_session_handle );
   }
   return true;
}
 
/**
* Reads the requested session data from the database.
*
* @param $key          Unique session ID of the requested entry.
*
* @return  string      The requested session data, or false on failure.
*/
function pgsql_session_read($key)
{
   global $pgsql_session_handle, $pgsql_session_table;
 
   $key = addslashes($key);
   $expiry = time();
 
   /* Build and execute the database query. */
   $query = "select data, user_id, debug_mode from $pgsql_session_table where session_id = '$key' and expiry >= $expiry";
   if( !( $result = @pg_exec( $pgsql_session_handle, $query ) ) )
   {
       session_error( "Read : Impossible de lire la session.\n   D'après postgres la cause est :\n" . pg_last_error( $pgsql_session_handle ), true );
   }
 
   if( $result && ( pg_numrows( $result ) == 1) )
   {
       $_SESSION = unserialize( pg_result($result, 0, 'data') );
       $_SESSION['s_ffecompet_user'] = @pg_result($result, 0, 'user_id');
       if( ! defined( "DEBUG_MODE" ) )
       {
           define( "DEBUG_MODE", false );
       }
         $_SESSION['debug_mode'] = DEBUG_MODE || ( @pg_result( $result, 0, 'debug_mode' ) == 't' );
       @pg_freeresult( $result );
   }
     return '';
}
 
/**
* Writes the provided session data with the requested key to the database.
*
* @param $key          Unique session ID of the current entry.
* @param $val          String containing the session data.
*
* @return  boolean     True on success, false on failure.
*/
function pgsql_session_write($key, $val)
{
   global $pgsql_session_handle, $pgsql_session_table, $pgsql_session_maxlifetime, $USER_ENV;
 
   $key = addslashes($key);
     $s_ffecompet_user = $_SESSION['s_ffecompet_user'];
   unset( $_SESSION['s_ffecompet_user'] );
     $debug_mode = $_SESSION['debug_mode'] ? 't' : 'f';
   unset( $_SESSION['debug_mode'] );
     $val = addslashes( serialize( $_SESSION ) );
   $expiry = time() + $pgsql_session_maxlifetime;
 
   $query = 'begin; ';
   $query .= "select * from $pgsql_session_table where session_id = '$key' for update; ";
   if( !( $result = @pg_exec( $pgsql_session_handle, $query ) ) )
   {
       session_error( "Write : Impossible de lire la session.\n   D'après postgres la cause est :\n" . pg_last_error( $pgsql_session_handle ), true );
   }
 
   if( pg_numrows( $result ) < 1 )
   {
       $query = "insert into $pgsql_session_table ( session_id, data, user_id, debug_mode, ip_adress, env, expiry ) values( '$key', '$val', '$s_ffecompet_user', '$debug_mode', '$_SERVER[REMOTE_ADDR]', $USER_ENV, $expiry ); ";
       //echo $query;
   }
   else
   {
       $query = "update $pgsql_session_table set expiry=$expiry, env=$USER_ENV, data='$val', user_id='$s_ffecompet_user', debug_mode='$debug_mode' where session_id='$key'; ";
   }
   $query .= 'commit;';
     if( !( $result = @pg_exec( $pgsql_session_handle, $query ) ) )
   {
       session_error( "Impossible d'écrire la session.\n   D'après postgres la cause est :\n" . pg_last_error( $pgsql_session_handle ), true );
   }
 
   $ret = ( pg_cmdtuples( $result ) == 0 );
   @pg_freeresult($result);
 
   return ($ret);
}
 
/**
* Destroys the requested session.
*
* @param $key          Unique session ID of the requested entry.
*
* @return  boolean     True on success, false on failure.
*/
function pgsql_session_destroy($key)
{
   global $pgsql_session_handle, $pgsql_session_table;
 
   $key = addslashes($key);
 
   $query = "delete from $pgsql_session_table where session_id = '$key'";
   if( !( $result = @pg_exec( $pgsql_session_handle, $query ) ) )
   {
       session_error( "Impossible de détruire la session.\n   D'après postgres la cause est :\n" . pg_last_error( $pgsql_session_handle ), false );
   }
 
   $ret = ( $result != 0 );
   @pg_freeresult($result);
 
   return $ret;
}
 
/**
* Performs session garbage collection based on the provided lifetime.
*
* @param $maxlifetime  Maximum lifetime of a session. NON utilisé !
*
* @return  boolean     True on success, false on failure.
*/
function pgsql_session_gc($maxlifetime)
{
   global $pgsql_session_handle, $pgsql_session_table;
 
   $expiry = time();
 
   $query = "delete from $pgsql_session_table where expiry < $expiry";
   if( !( $result = @pg_exec( $pgsql_session_handle, $query ) ) )
   {
       session_error( "Impossible d'executer le 'garbage collection'.\n   D'après postgres la cause est :\n" . pg_last_error( $pgsql_session_handle ), false );
   }
 
   $ret = ( $result != 0 );
   @pg_freeresult( $result );
 
   return $ret;
}
 
// Enregistrement en fichier LOG des problèmes rencontrés par le gestionnaire de sessions.
function session_error( $msg, $exit )
{
   if( $fic = @fopen( LOG_FILE, "a" ) )
   {
       $buff = "\n";
       $buff .= "+================================================================================================+\n";
       $buff .= "|   Erreur dans le gestionnaire de sessions                                                      |\n";
       $buff .= "+------------------------------------------------------------------------------------------------+\n";
       $buff .= "   Date         = " . strftime( "%d/%m/%Y" ) . "\n";
       $buff .= "   Heure        = " . strftime( "%H:%M:%S" ) . "\n";
       $buff .= "   Session ID   = " . session_id() . "\n";
       $buff .= "   url          = " . $_SERVER['SCRIPT_FILENAME'] . "\n";
       $buff .= "   ip           = " . $GLOBALS['IP'] . "\n";
       $buff .= "+-----------------------------------------------------------------------------------------------+\n";
       $buff .= "|  Message d'erreur :                                                                           |\n";
       $buff .= "|  " . $msg . "\n";
       $buff .= "+===============================================================================================+\n";
       // Ecriture du message
       @fwrite( $fic, $buff );
       @fclose( $fic );
   }
     if( $exit )
   {
       include( SYS_PATH . "php/mire.php" );
       exit;
   }
}
 
/* Register the session handling functions with PHP. */
session_set_save_handler(
   'pgsql_session_open',
   'pgsql_session_close',
   'pgsql_session_read',
   'pgsql_session_write',
   'pgsql_session_destroy',
   'pgsql_session_gc'
);
 
?>


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 06-04-2004 à 09:17:47    

ouhla j'ai encore beaucoup de boulot je crois et bcp a apprendre et comprendre  :ange:

Reply

Marsh Posté le 06-04-2004 à 14:47:44    

ouhla pareil :(

Reply

Marsh Posté le 06-04-2004 à 15:51:32    

vous auriez une bonne doc au sujet de tout ca?
 :)

Reply

Marsh Posté le 06-04-2004 à 18:04:30    

j'ai des pistes ;)
 
session_set_save_handler  

Reply

Marsh Posté le 06-04-2004 à 21:50:13    

La doc !
Y'as celle de PHP sur les sessions, et un exemple pour PGSQL :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed