Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/01/2011, 20h42   #1
Nouveau Membre du Club
 
Inscription : janvier 2008
Messages : 125
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 125
Points : 29
Points : 29
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 :
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 :
$_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
xoum89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 11h39   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
Hello

Citation:
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 :
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 12h08   #3
Futur Membre du Club
 
Homme Sébastien Jover
Ingénieur d'étude
Inscription : mars 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Jover
Âge : 31
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Ingénieur d'étude
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 22
Points : 17
Points : 17
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. :-)
cr0wseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 12h44   #4
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h02   #5
Expert Confirmé
 
Avatar de RunCodePhp
 
Inscription : janvier 2010
Messages : 2 706
Détails du profil
Informations personnelles :
Localisation : Réunion

Informations forums :
Inscription : janvier 2010
Messages : 2 706
Points : 3 274
Points : 3 274
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 :
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.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]
RunCodePhp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 13h57   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
c'est pas serialize mais session_encode
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 14h08   #7
Futur Membre du Club
 
Homme Sébastien Jover
Ingénieur d'étude
Inscription : mars 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Jover
Âge : 31
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Ingénieur d'étude
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 22
Points : 17
Points : 17
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().
cr0wseb est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/01/2011, 14h30   #8
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 015
Points : 5 015
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
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h03   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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 ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/01/2011, 15h11   #10
Futur Membre du Club
 
Homme Sébastien Jover
Ingénieur d'étude
Inscription : mars 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Jover
Âge : 31
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Ingénieur d'étude
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 22
Points : 17
Points : 17
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.
cr0wseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h16   #11
Futur Membre du Club
 
Homme Sébastien Jover
Ingénieur d'étude
Inscription : mars 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Jover
Âge : 31
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Ingénieur d'étude
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 22
Points : 17
Points : 17
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
cr0wseb est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/01/2011, 15h20   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h42   #13
Futur Membre du Club
 
Homme Sébastien Jover
Ingénieur d'étude
Inscription : mars 2010
Messages : 22
Détails du profil
Informations personnelles :
Nom : Homme Sébastien Jover
Âge : 31
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Ingénieur d'étude
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2010
Messages : 22
Points : 17
Points : 17
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 ?
cr0wseb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h54   #14
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 466
Points : 8 466
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)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h57.


 
 
 
 
Partenaires

Hébergement Web