session et objet

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : session et objet

par zeus » 21 avr. 2006, 16:41

Je viens de répondre sur l'autre sujet (http://www.phpfrance.com/forums/voir_sujet-17601.php)

Mais soit un peu patient, les gens répondent quand ils ont le temps ;)

par nabs » 21 avr. 2006, 16:39

dsl de remonter le sujet mais ya tjrs pas la solution pour faire passer un objet par session qui ouvre une connexion sur bdd. j'ai laissé un nouveau sujet et pas de reponse, donc j'espere qu'en remontant celui on puisse avoir la réponse. ca permettra de répondre aux 2 sujets d'un coup.
merci de bien vouloir répondre.

par jeff » 18 nov. 2005, 09:44

la vla ma solution merci
:P

mais bon je peut pas metre mon objet ensession etant donnée que j'utilise des ressources(notament celle de mysql)
donc je vais essayer __sleep et __wakeup (si j'ai bien elles perment de choisir les attributs a mettre en session)

par sadeq » 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

besoin d'aide pour un boulet

par jeff » 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 :?:

par jeff » 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';
	}
](*,)

par jeff » 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);
	}

par jeff » 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

par sadeq » 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é!";
?>

par Liquid » 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+

par jeff » 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

par Liquid » 15 nov. 2005, 17:32

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

par sadeq » 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

par jeff » 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:

par Liquid » 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 ?