session et objet

Mammouth du PHP | 1311 Messages

15 nov. 2005, 16:21

salut
j'ai un peut honte de vous embetez avec ca (d'autant plus qu'il y a plein de poste sur le meme sujet :oops: )

voila je pense que c'est un probleme de conception generale :(

je veut faire un acces membre en gerant les actions des membres dans celui et aussi leur droit sur la base de donnée

pour ca
j'ai un objet qui me permait de me connecter a une la db
le constructeur
$mysql=Mysqldb($serveur,$login,$pass,$base)
(ou $login et $pass depend des info dans la db)

un objet User qui verifier les actions d'un utilisateur et qui contient un login et un mot de passe (pour la db) suivant le groupe d'appartenace de l'utilisateur

class User
{
	/**
	 * login
	 *
	 * @private string
	 */
	private $login;
	/**
	 * etat d'un utilisateur
	 *
	 * @private string
	 */
	private $auth;
	private $level;
	/**
	 * objet dao
	 *
	 * @private objet
	 */
	private $dao;
	/**
	 * login pour base de données(suivant le groupe)
	 *
	 * @private string
	 */
	private $log_data;
	/**
	 * mot de passe db
	 *
	 * @private varchar
	 */
	private $mdp_data;
	
	public function __construct()
	{
		$database=new Mysqldb(SERVEUR,LOGIN,PASS,BASE);
		$this->dao=new DAO($database);
	}

	/**
	 * authentifie l'utilisaeur
	 *
	 * @param string $login
	 * @param string $mdp
	 * @return return un objet si vrai sinon false
	 */
	public function authUser($login,$mdp)
	{
		$this->dao->SetVar(array('user as u','groups as g','group_user as gu'),array('g.groupname','g.log_data','g.mdp_data'));
		$param=array("u.login='$login'","u.mdp='".md5($mdp)."'",'u.userid=gu.userid','g.groupid=gu.groupid');
		if($tab=$this->dao->Select($param))
		{
			if($tab[0]!='internaut')
			{
				$this->login=$login;
				$this->auth='ok';
				$this->level=$tab[0];
				$this->log_data=$tab[1];
				$this->mdp_data=$tab[2];
				//print_r($this);
				return true;
			}
		}
		else 
			return false;
	}
j'ai une metode getUser qui me permet de prendre les attributs pour les mettre en session mais ca n'a pas l'air de fonctionner
public function getUser()
	{
		return array('login'=>$this->login,'level'=>$this->level,'auth'=>$this->auth,'log_data'=>$this->log_data,'mdp_data'=>$this->mdp_data);
	}
et
foreach($user->getUser() as $cle=>$val)
				{
					//echo $val;
					$_SESSION[$cle]=$val;
				}

bon pour resumer j'aimerai deja arriver a mettre en sessions les proprieter de user (et pour le reste si vous savez comment faire un truc prope je suis preneur :) )

merci

Eléphant du PHP | 70 Messages

15 nov. 2005, 16:47

Et si tu faisais tout simplement :
$user = new User();
// Bla bla bla
$_SESSION["user"] = $user;
Et quand tu as besoin de User :
$user = $_SESSION["user"];
$login = $user->getLogin();
$auth = $user->getAuth();
$level = $user->getLevel();
// Bla bla bla

Mammouth du PHP | 1311 Messages

15 nov. 2005, 16:56

tiens l'une des personnes que j'attendai sur le post :wink:

malheuresement je n'ai pas les idees tres clairs => et donc je voi trop comment ton code pourrait repondre a mes attentes (si tu pouvais m'eclaissir :) )


j'ai modifier mon code de user
	public function __construct()
	{
		$this->login=$_SESSION['login'];
		$this->auth=$_SESSION['auth'];
		$this->log_data=$_SESSION['log_data'];
		$this->mdp_data=$_SESSION['mdp_data'];
		$this->level=$_SESSION['level'];
		$database=new Mysqldb(SERVEUR,$this->log_data,$this->mdp_data
,BASE);
		$this->dao=new DAO($database);
	}
je pense quand meme que j'ai un gros probleme de conception dans ma construction de mes objet??(c'est un peu le bordel)

Eléphant du PHP | 70 Messages

15 nov. 2005, 17:14

Avant d'aller plus loin, dis-moi si j'ai bien compris. Dans un premier temps un utilisateur se connecte avec un login et un mot de passe, s'il est authentifié le programme récupère toutes ses propriétés, créé un User et le peuple avec les données récupérées. Parmi ces propriétés il y a des droits d'accès à la base de données ?

Mammouth du PHP | 1311 Messages

15 nov. 2005, 17:15

bon je recommence mon post
je vais expliquer un peut plus mon probleme

mon site est bati sur une architecture MCV

dans mon controleur je fait appel a un objet user pour verifier les droits de celui-ci(par defait celui ci est un simple internaut)
	$use= new User();
	if($use->VerifActionUser($multiaction_controller,$action_to_run))
	{
			if(class_exists($multiaction_controller))
			{
				$actioncontroller = new $multiaction_controller();
				#verification des methodes
					$method_name = $action_to_run.'_action';

						$mv = $actioncontroller->$method_name();//appel une class et sa methode
						$Smarty = new Smarty_page();
						$Smarty->assign($mv->getModel());
						$Smarty->display($mv->getView());
						echo 'session index';
						print_r($_SESSION);
						echo 'user index';
						echo var_dump($use);
						echo 'modelviaew';
						echo var_dump($mv);

maintenant j'ai un module d'administration donc sur cette page les gens s'authentifie
et leur propriete sont enregistrer dans des sessions (ca fonctionne)
par ex
http://localhost/projet_ing/index.php?m ... ction=auth
appel la class Admin et la methode auth
$user = new User();		
			if(isset($_POST['log'])&&isset($_POST['pass']))
			{
				$log = addslashes(trim($_POST['log']));
				$mdp = addslashes(trim($_POST['pass']));
			}
			else 
				throw new MyException('une erreur c\'est produite ');
			
			if($user->AuthUser($log,$mdp))
			{
				foreach($user->getUser() as $cle=>$val)
				{
					$_SESSION[$cle]=$val;
				}
				echo 'session  essai ';
					print_r($_SESSION);
				$this->tpl='admin/index.tpl';
				$mv=new ModelView();
				$mv->setView($this->tpl);
				return $mv;
maintenant si j'appel
une autre methode du module d'administration (je remarque que la session a repris les valeurs par defaut :evil: )

quand je regarde mon code je me rend compte (du moins je pense) que j'ai pas tout a fait compris la POO??je crée trop d'objet du type Mysqldb ou user
:twisted:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 nov. 2005, 17:18

Sans devoir attacher la session à l'objet dans sa définition propre, tu peux passer les paramètres requis au constructeur.

Car la problèmatique est que tu ne peux affecter le login/pass aux propriétés login/pass de l'objet avant sa construction (new).

La réponse à ce problème est de passer les paramètres login/pass au constructeur.

Exemple :
<?
class machin {
//Définition des propriétés
public $login;
public $pass;

    //constructeur paramètré
    public function __construct($login, $pass) {
       //Affectation
       $this->login = $login;
       $this->pass = $pass;
        //ouverture de la base en utilisant login/pass
       ....
     }
    //2° constructeur sans paramètres
    public function __construct(){
       //Servira pour construire des objets sans automatiser l'ouverture de la base
    }
}
?>
Pour construire un objet machin avec ouverture de la BD :
$machin = new machin("toto", "son pass");

Si besoin est, on peut toujours construire des objets machin sans ouverture forcée de la BD :
$machin = new machin(); //sans passer les paramètres : sera pris en charge par le 2° constructeur.

Dans le cadre d'une session, il suffit de mémoriser l'objet machin dans une variable session et veiller à ne le reconstruire que pour une nouvelle session :
if (isset($_SESSION["machin"]))
      $machin = $_SESSION["machin"];
else {
        $machin = new machin("toto", "son pass");
        $_SESSION["machin"] = $machin;
}
.... //utiliser $machin
Ceci veut dire que l'objet doit provenir de la session s'il existe déjà sinon c'est un nouvel objet.

mais la meilleure écriture qui assure un enregistrement/mise à jour de l'objet contenu dans la session tout au long du programme est la suivante:
if (! isset($_SESSION["machin"])) $_SESSION["machin"] = new machin("toto", "son pass");
...//utiliser $_SESSION["machin"] comme objet machin
Modifié en dernier par sadeq le 15 nov. 2005, 17:42, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 70 Messages

15 nov. 2005, 17:32

sadeq, la surcharge n'est pas supportée par PHP.

Mammouth du PHP | 1311 Messages

15 nov. 2005, 17:34

il faut que je reflechisse a tout cela
et surtout au deuxieme constructeur (car en regardant mes metodes je remarques quelles font toutes ou presque apelle a la db) :(

merci pour ces reponses

si vous avez d'autre truc a me faire remarquer l'acher vous

Eléphant du PHP | 70 Messages

15 nov. 2005, 17:40

Justement, à cause du non support de la surcharge (overloading) on ne peut pas avoir plusieurs constructeurs (ni méthodes) portant le même nom dans une même classe (ou hiérarchie de classes) [pour le moment] en PHP.

Je vais prendre "5 minutes" pour rédiger "un truc bien" sur une implémentation du modèle MVC en PHP en prenant comme cas une authentification... A+

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

15 nov. 2005, 18:08

on attend un PHP OO plus avancé :wink:

Tiens voici un truc qui peut te servir :
<? 
class machin { 
//Définition des propriétés 
public $login; 
public $pass;
public $autorisé; 

    //constructeur paramètré 
    public function __construct($login, $pass) { 
       //Affectation 
       $this->login = $login; 
       $this->pass = $pass; 
        //ouverture de la base en utilisant login/pass 
     	if (@mysql_connect("localhost", $login, $pass)) {
			$this->autorisé = true;
		}
	    else {
			$this->autorisé = false;
		} 
     } 
}

//test
if (!$_SESSION["machin"]) $_SESSION["machin"]= new machin("root", "root");
extract( $_SESSION );

if ($machin->autorisé) echo "<p>$machin->login autorisé!";
else echo "<p>$machin->login non autorisé!";
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 1311 Messages

16 nov. 2005, 15:41

je vien de remarquer un truc a chaque fois que j'apelle une page une session est cree (avec un nouveau numero)??

apparement il ne regenere pas la session il en creer une nouvelle

j'utilise les cookies pour les faire passer

Mammouth du PHP | 1311 Messages

16 nov. 2005, 17:55

est ce que je n'aurai pas interet a utiliser __sleep et __wakeup :?: :?:

dans mon objet a mettre en sessions j'ai des ressource(id de connexion a la base) mes problemes viennent de la non :?:

voici l'objet user sous sa orme actuel

Code : Tout sélectionner

object(User)#1 (7) { ["login:private"]=> string(9) "internaut" ["auth:private"]=> string(2) "ok" ["level:private"]=> string(9) "internaut" ["dao:private"]=> object(DAO)#3 (5) { ["db:protected"]=> object(Mysqldb)#2 (2) { ["res:private"]=> resource(10) of type (mysql result) ["conn:private"]=> resource(5) of type (mysql link) } ["ArrayTable:protected"]=> NULL ["ArrayChamp:protected"]=> NULL ["Atable"]=> array(5) { [0]=> string(9) "user as u" [1]=> string(11) "groups as g" [2]=> string(16) "group_user as gu" [3]=> string(16) "group_auth as ga" [4]=> string(12) "module as mo" } ["Achamp"]=> array(1) { [0]=> string(7) "ga.auth" } } ["log_data"]=> string(9) "internaut" ["mdp_data"]=> string(16) "BCUfmeS:pMa9sMqd" ["sessionid:private"]=> string(32) "1d8ce63405857a1b073b0ee6ff75ac74" }
j'ai essayer d'implementer __sleep
mais j'ai des erreur
	public function __sleep()
	{
		return array('login'=>$this->login,'auth'=>$this->auth,'level'=>$this->level,'log_data'=>$this->log_data,'mdp_data'=>$this->mdp_data,'sessionid'=>$this->sessionid);
	}

Mammouth du PHP | 1311 Messages

17 nov. 2005, 17:30

j'ai adopter la solution a sadeq
mais je n'arrive pas a recuperer la session :oops:
voici le code qui se trouve dans mon controleur
if (!isset($_SESSION['use']))
	{ 
		#definission d'un utilisateur par defaut
		$_SESSION['use'] = new User('internaut','BCUfmeS:pMa9sMqd');
 		$_SESSION['use']->AuthUser('internaut','lapin');
 		echo 'la session vien d\'etre creer';
	}
	else{
		$use=$_SESSION['use'];
		$use->login;
		echo 'ma session existe';
	}
](*,)

Mammouth du PHP | 1311 Messages

17 nov. 2005, 19:11

je viens de faire un test con
essai.php

mes sessions ne passe pas
mais je vois pas pourquio
<?php
session_start();
$_SESSION['moi']='bonjours';

echo '<a href=essai2.php>ici</a>';
?>
et essai2.php
<?php
session_start();
print_r($_SESSION);
echo $_SESSION['moi'];
?>
et j'ai un undifined index

voici mon php.ini

Code : Tout sélectionner

session.auto_start Off Off session.bug_compat_42 On On session.bug_compat_warn On On session.cache_expire 180 180 session.cache_limiter nocache nocache session.cookie_domain no value no value session.cookie_lifetime 0 0 session.cookie_path / / session.cookie_secure Off Off session.entropy_file no value no value session.entropy_length 0 0 session.gc_divisor 100 100 session.gc_maxlifetime 1440 1440 session.gc_probability 1 1 session.hash_bits_per_character 4 4 session.hash_function 0 0 session.name PHPSESSID PHPSESSID session.referer_check no value no value session.save_handler files files session.save_path E:/wamp/tmp E:/wamp/tmp session.serialize_handler php php session.use_cookies On On session.use_only_cookies Off Off session.use_trans_sid 0 0
alors boulet ou non :?:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 nov. 2005, 09:42

session.use_cookies On On
Remarques-tu cette ligne, elle dit que la session utilise un cookies côté client, alors si ton navigateur a désactivé les cookies la session se casse à chaque rechargement.

Solution : Active les cookies côté navigateur
Modifié en dernier par sadeq le 18 nov. 2005, 10:13, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène