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 :

Php POO gestion avec session


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 161
    Points : 75
    Points
    75
    Par défaut Php POO gestion avec session
    Bonjour,
    J'ai fait un site en objet et ces objets et je les places dans les sessions pour les transporter de page en page.

    Une fois la nouvelle page chargé je recrée une variable avec l'objet de la session transporté.

    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
    19
    session_start();
    if (!isset($_SESSION['User'])){
    	$user = new Membres($bdd);
    	if ($_SERVER['PHP_SELF'] != 'index.php' && !$user->isAuthenticated())
    	header('Location: index.php');
    }
    else{
    	if (empty($_SESSION['User'])){
    		$user = new Membres($bdd);
    		$_SESSION['User'] = $user;
    		if ($_SERVER['PHP_SELF'] != 'index.php')
    		header('Location: index.php');
    	}
    	else{
    		$user = $_SESSION['User'];
    		if ($_SERVER['PHP_SELF'] != 'index.php' && !$user->isAuthenticated())
    		header('Location: index.php');
    	}
    }
    Le problème en faisant cela, c'est que l'objet n'est pas réactualisé dans la session et donc de page en page.

    D'où ma question :
    Faut-il utiliser l'objet de la session
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['User']->MafonctionPublic();
    (je sais même pas si on peux le faire)

    ou alors utiliser la variable avec l'objet crée et avant chaque changement de page replacer l'objet dans la session

    Je vous demande ça pour savoir quelle est la meilleur façon de coder et qui sera le plus rapide.
    Si il y a d'autres solutions je suis tous ouïe.


    Merci

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Faut-il utiliser l'objet de la session
    Code :

    $_SESSION['User']->MafonctionPublic();

    (je sais même pas si on peux le faire)
    Oui tu peux.

    Remarque, en PHP les objets sont systématiquement manipulés par référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class a { public $a; public function setA ($a) {$this->a = $a; } }
     
    $a = new a();
    $arr = array('a' => $a);
     
    $a->setA('hello');
     
    echo $arr['a']->a; // Affiche 'hello'
     
     
    $arr['a']->setA("salade");
     
    echo $a->a; // Affiche 'salade'
    Ce qui veut dire que tu peux soit manipuler directement l'objet sur la session ou le sortir dans une variable.

    Fais quand même attention: les sessions ne sont pas partagés entre les utilisateurs, donc les objets que tu mettra dessus ne seront pas synchrones entre plusieurs utilisateurs, ce qui peut conduire à des collisions si par exemple ils modifient les mêmes tuples de database.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Gérant
    Inscrit en
    Mars 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Pour envoyer un objet en session en gardant ses propriétés il faut utiliser la fonction serialize(). Je pense que cela répondra a tes question. :-)

  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Pas nécessairement: PHP appelle automatiquement serialize avant de se terminer.
    Si tes objets ont une forme spécifique, tu peux implémenter l'interface Serializable qui permet de définir comment les objets sont sérialisés; ce n'est utile que dans le cas où tes objets ont un comportement de persistance particulier comme des objets caractérisant une connexion à la base de données ou une ressource sur un fichier.
    Tu trouvera toute la doc nécessaire ici: http://php.net/manual/en/function.serialize.php

    J'ai écrit il y a quelque temps un article (que je n'ai toujours pas publié - honte sur moi) sur l'implémentation d'une identity map sur session: un cache d'objets sur session si tu préfères: http://www.developpez.net/forums/d99...-contexte-php/

    -- Edit
    waaah il faut vraiment que je le corrige ce truc, j'en suis plus là depuis un moment

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    De mon coté, et pour que l'Objet et l'élément dans la session soit une même référence, je procède ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class UnObjet {
        public function __construct() {
            $this->objet =& $_SESSION['objet'];
        }
    }
    Théoriquement, que l'on modifie directement par la variable de session "objet" ou qu'on modifie la propriété "objet" via l'Objet UnObjet, les valeurs seront les mêmes.
    Et bien sûr, les valeurs seront aussi conservées tout au long de la navigation.

    J'ai jusqu'à lors jamais eu besoin de sérialiser ou désérialiser, Php le fait automatiquement.
    Il faut juste que la déclaration de la classe soit faite avant.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    c'est pas serialize mais session_encode

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Gérant
    Inscrit en
    Mars 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    c'est pas serialize mais session_encode
    session_encode() is the PHP default for serialising into and out of sessions but does not offer the flexibility to read the stored data outside of a session.

    serialize() does everything almost exactly the same as session_encode() and lets you read session data outside of sessions but the two types of serialisation do not work together. You cannot replace session_encode() with serialize().

  8. #8
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    A moins que vous n'utilisiez un mécanisme de persistance maison (session_set_save_handler) on ne se préoccupe jamais de comment PHP sérialise et déserialise les données.

    Implémentez Serializable là ou il faut et PHP fait le reste

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par cr0wseb Voir le message
    session_encode() is the PHP default for serialising into and out of sessions but does not offer the flexibility to read the stored data outside of a session.

    serialize() does everything almost exactly the same as session_encode() and lets you read session data outside of sessions but the two types of serialisation do not work together. You cannot replace session_encode() with serialize().
    oui et ?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Gérant
    Inscrit en
    Mars 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    oui et ?
    Eh bien tant qu'à faire autant utiliser le plus flexible possible... non? Pourquoi veux tu utiliser session_encode plutôt que serialize? Dans quel objectif? As-tu un argument... Cela pourrait m’intéresser à titre personnel.

    Parceque si je reprends ton commentaire:
    "c'est pas serialize mais session_encode" => Cela signifie qu'utiliser serialize est une faute... Or j'utilise toujours cette méthode sans désagréments aucun.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Gérant
    Inscrit en
    Mars 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Pas nécessairement: PHP appelle automatiquement serialize avant de se terminer.
    Si tes objets ont une forme spécifique, tu peux implémenter l'interface Serializable qui permet de définir comment les objets sont sérialisés; ce n'est utile que dans le cas où tes objets ont un comportement de persistance particulier comme des objets caractérisant une connexion à la base de données ou une ressource sur un fichier.
    Tu trouvera toute la doc nécessaire ici: http://php.net/manual/en/function.serialize.php

    J'ai écrit il y a quelque temps un article (que je n'ai toujours pas publié - honte sur moi) sur l'implémentation d'une identity map sur session: un cache d'objets sur session si tu préfères: http://www.developpez.net/forums/d99...-contexte-php/

    -- Edit
    waaah il faut vraiment que je le corrige ce truc, j'en suis plus là depuis un moment
    Intéressant ^^

    Tant qu'à faire puisque vous m'avez l'air d'être ultra compétents dans bcp de domaines du PHP pourriez-vous faire un petit tour sur ma question ? http://www.developpez.net/forums/d10...rtie-image-gd/ Merci d'avance

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par cr0wseb Voir le message
    Eh bien tant qu'à faire autant utiliser le plus flexible possible... non? Pourquoi veux tu utiliser session_encode plutôt que serialize? Dans quel objectif? As-tu un argument... Cela pourrait m’intéresser à titre personnel.

    Parceque si je reprends ton commentaire:
    "c'est pas serialize mais session_encode" => Cela signifie qu'utiliser serialize est une faute... Or j'utilise toujours cette méthode sans désagréments aucun.
    parce que déjà c'est fait pour, si la fonction ne servait a rien elle n'existerai pas, et de plus les sessions peuvent être cryptées (Suhosin patch/extension) et dépendent de ton module (Registered serializer handlers) ce que serialize ne fait pas contraiement a session_encode/decode qui mettra le bon format peu importe le module/cryptage

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Gérant
    Inscrit en
    Mars 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    parce que déjà c'est fait pour, si la fonction ne servait a rien elle n'existerai pas, et de plus les sessions peuvent être cryptées (Suhosin patch/extension) et dépendent de ton module (Registered serializer handlers) ce que serialize ne fait pas contraiement a session_encode/decode qui mettra le bon format peu importe le module/cryptage
    Ben voilà. ^^
    Après serialize existe aussi ;-) (donc ce n'est pas un argument) et fonctionne très bien mais si je comprends bien il est préférable d'utiliser session_encode dans la cadre des session afin de coller au spécificités du serveur. J'ai tout bien compris ?

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par cr0wseb Voir le message
    Ben voilà. ^^
    Après serialize existe aussi ;-) (donc ce n'est pas un argument) et fonctionne très bien mais si je comprends bien il est préférable d'utiliser session_encode dans la cadre des session afin de coller au spécificités du serveur. J'ai tout bien compris ?
    voila, (un)serialize marche uniquement, en module file avec le serializer php (et sans Suhosin), alors que session_(d)encode marche avec tout type de module serializer (et Suhosin)

Discussions similaires

  1. [POO] PHP 5 - gestion de la persistance
    Par BRAUKRIS dans le forum Langage
    Réponses: 12
    Dernier message: 07/07/2010, 13h34
  2. Gestion des sessions avec applet
    Par Mister Nono dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/08/2006, 18h27
  3. [POO] class php de gestion de stats
    Par cedsib dans le forum Langage
    Réponses: 5
    Dernier message: 18/05/2006, 12h43
  4. Probleme d'identification avec sessions PHP
    Par bontbont dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 19h15
  5. Réponses: 3
    Dernier message: 23/08/2004, 17h49

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