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 :

Session et accesseurs


Sujet :

Langage PHP

  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut Session et accesseurs
    Bonjour,

    Dans le but de m'initier à PHP, j'ai développer un script qui permet de jouer a une genre de MasterMind.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
     
     
    <?php 
    class MasterMind {
    	private $code;
    	private $tableauPropositions = array();
    	private $bienPlaces = array();
    	private $malPlaces = array();
    	private $nbTentatives;
     
    	public function __construct() { // constructeur qui genere mon code aleatoire
    		$chiffres = array (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
    		shuffle($chiffres); // je melange mon tableau de 9 chiffres...
    		$this->code = array ($chiffres[0], $chiffres[1], $chiffres[2], $chiffres[3]); //...et je prends les 4 premieres cases	
    		$this->nbTentatives = 0; 
    	}
     
    	public function getCode($i) {
    		return $this->code[$i];
    	}
     
    	public function getTableauPropositions($i) {
    		return $this->tableauProposiitons[$i];
    	}
     
    	public function getBienPlaces($i) {
    		return $this->bienPlaces[$i];
    	}
     
    	public function getMalPlaces($i) {
    		return $this->malPlaces[$i];
    	}
     
    	public function getNbTentatives() {
    		return $this->nbTentatives;
    	}
     
    	public function setCode($i, $valeur) {
    		$this->code[$i] = $valeur;
    	}
     
    	public function setTableauPropositions($i, $valeur) {
    		$this->tableauPropositions[$i] = $valeur;
    	}
     
    	public function setBienPlaces($i, $valeur) {
    		$this->bienPlaces[$i] = $valeur;
    	}
     
    	public function setMalPlaces($i, $valeur) {
    		$this->malPlaces[$i] = $valeur;
    	}
     
    	public function setNbTentatives($valeur) {
    		$this->nbTentatives = $valeur;
    	}
     
    	public function test($prop) {
     
    		// je mets l'entier passé en paramètre dans un tableau
    		$propTableau[3] = $prop % 10;
    		$propTableau[2] = ($prop / 10) % 10;
    		$propTableau[1] = ($prop / 100) % 10;
    		$propTableau[0] = (int)($prop / 1000);
     
     
    		// je compare les deux tableaux $propTableau et $code
    		$this->bienPlaces[$this->nbTentatives] = 0;
    		$this->malPlaces[$this->nbTentatives] = 0;
    		for ($i=0 ; $i<4 ; $i++) {
    			if ($propTableau[$i] == $this->code[$i]) {
    				$this->bienPlaces[$this->nbTentatives]++;					
    			}
    			else if (in_array($propTableau[$i], $this->code)) {
    				$this->malPlaces[$this->nbTentatives]++;
    			}
    		}			
    	}
     
    	public function afficheTableauJeu() { 
    	?>
    		<table border="1">
    			<tr><td>Numero</td> <td>Propositions</td> <td>Bien placé(s)</td> <td>Mal placé(s)</td></tr>
     
    			<?php 
    			for ($i=1 ; $i <= $this->nbTentatives ; $i++) { 
    			?>
    				<tr><td><?php echo $i;?></td> 
    					<td> <?php echo $this->tableauPropositions[$i];?></td> 
    					<td> <?php echo $this->bienPlaces[$i];?></td> 
    					<td> <?php echo $this->malPlaces[$i];?></td></tr>
    			<?php
    			} 
    			?>
     
    			<tr><td></td>
    				<td><form action="mastermindSession2.php" method="post"> 
    					<input type="number" name="proposition" /></td> 
    				<td></td><td></td></tr>
    		</table>				
    		<input type="submit" value="Valider" />
    		</form>				
    	<?php
    	}
    }
     
    $lifetime=600;
    session_start();
    setcookie(session_name(),session_id(),time()+$lifetime);
    ?>
     
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8" />
    		<link rel="stylesheet" href="" />
    		<title>Mastermind avec Session</title>
    	</head>
     
    	<body>		
    	<?php
    	if (!(isset($_POST['proposition']))) { // si j'arrive la premiere fois sur la page
    		$_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    		$_SESSION['mastermind']->afficheTableauJeu();		
     
    	} else if ((is_numeric($_POST['proposition'])) && (strlen(strval($_POST['proposition']))) == 4)	{ // cas normal
    		$_SESSION['mastermind']->setNbTentatives($_SESSION['mastermind']->getNbTentatives() + 1);
    		$_SESSION['mastermind']->setTableauPropositions($_SESSION['mastermind']->getNbTentatives(), $_POST['proposition']);
    		$_SESSION['mastermind']->test($_POST['proposition']);
    		$_SESSION['mastermind']->afficheTableauJeu();
     
    		if (($_SESSION['mastermind']->getBienPlaces($_SESSION['mastermind']->getNbTentatives())) == 4) { // cas de victoire
    			echo "VICTOIRE! FELICITATIONS!";
    		}	
    	}
     
    	else { // cas "saisie incorrecte"
    		$_SESSION['mastermind']->afficheTableauJeu();
    		echo "Veuillez seulement saisir 4 chiffres distincts, svp!";
    	}
    	?>		
     
    	</body>
    </html>
    Il fonctionne globalement, mais j'aimerai réaliser encore 2 choses:

    1) Que lorsque qu'on quitte une partie en cours et qu'on y revient dessus un peu plus tard, la partie n'est pas bougé.
    Je pensais que mettre "session_start();" après la déclaration de ma classe allait suffire mais apparemment non...
    J'utilise WampServer (je sais pas si c'est utilise de le préciser)

    2) Lors du développement, j'ai pas voulu m’embêter et j'ai mis les attributs de ma classe publics.
    Je veux rectifier le tir, mais j'ai pas forcement envie d'écrire tous les accesseurs et leurs appels...
    J'ai entendu parlé des accesseurs "magiques". J'ai les ai crée (voir commentaires dans mon code) mais ça n'a pas l'air de fonctionner non plus.

    J'espère que vous pourrez m'aider a résoudre ces problèmes.

    Merci!
    Bonne soirée.

  2. #2
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Hello !

    Par défaut, une session est détruite à la fermeture du navigateur. Pour lui fixer une durée de vie fixe, tu peux aller voir de ce côté là : http://www.php.net/manual/fr/functio...kie-params.php

    Pour les accesseurs magiques, je ne les ai jamais utilisés mais quel est le message d'erreur que tu obtiens ? (Ca m'a pas l'air débile pourtant ce que tu as écris).

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    J'y ai pensé aussi mais ça marche pas.
    Est ce que ça a pas un rapport avec le fait que je sois en local?

    Sur le code ci dessus, si j'enleve les commentaires sur mes accesseurs et que je mets tous mes attributs privés, j'ai 2 erreurs:
    Notice: Indirect modification of overloaded property MasterMind::$tableauPropositions has no effect in C:\Program Files\wamp\www\mastermindSession.php on line 110
    Notice: Undefined offset: 1 in C:\Program Files\wamp\www\mastermindSession.php on line 72

  4. #4
    Membre Expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Ah oui en effet, premier commentaire de la doc pour cette fonction "session_set_cookie_params" : http://www.php.net/manual/fr/functio...ams.php#100657

    C'est assez explicite, voilà donc le code qui devrait marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $lifetime=600;
    session_start();
    setcookie(session_name(),session_id(),time()+$lifetime);
    Pour les accesseurs ok du coup c'est logique, ton setter ne peut pas marcher sur les attributs de type tableau. Et honnêtement, je ne sais pas comment ils se comportent dans ce cas là, ni même si cela est possible de les utiliser.

  5. #5
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Et non, malheureusement toujours pas...

    Pour les accesseurs, tant pis, ça m'apprendra a les avoir mis public au début.

    En revanche, pour la session, c'est un peu plus embêtant, c'était un peu le but de mon exercice...
    Peut être en faisant tourner mon script sur un vrai serveur?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    1- Évite d'utiliser les méthodes magiques dans la mesure du possible. Il est préférable que tout soit explicite afin d'éviter les malentendus plus tard. Tout bon IDE qui se respecte te permettra de créer des getters et des setters automatiquement.

    2. Si tu veux malgré tout utiliser des getters/setters pour tes tableaux, la bonne méthode est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function __get($attribut) {
            $properties = get_object_vars($this);
     
            if(array_key_exists($attribut, $properties)){
                return $properties[$attribut];
            } 
     
            else {
                //etc...
            }
    }
    3.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    $_SESSION['mastermind']->afficheTableauJeu();
    ARGH :-( Évite de manipuler directement une superglobale comme ça. C'est illisible, c'est dangereux (les superglobales peuvent être utilisées par d'autres parties de ton application, voire dans le cas des sessions par d'autres pages et autres "sessions" ultérieures et tu risques d'avoir des effets imprévisibles en faisant ça. Les sessions sont destinées à faire passer un état d'une page à l'autre, par pour servir de conteneur à objet. Je ne comprends même pas que PHP autorise ça :-(

  7. #7
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    J'ai mis mon code à jour dans le premier message.
    J'ai ajouté les accesseurs, mais j'ai une erreur à la ligne 34 lors de la validation de mon formulaire:
    Parse error: syntax error, unexpected '{', expecting '(' in C:\Program Files\wamp\www\mastermindSession.php on line 34
    Je comprends pas pourquoi...

    Pour ce qui est de la manipulation des superglobales, c'est mon exercice qui veut ça. La consigne me demande de stocker une instance de MasterMind dans une session PHP. Donc désolé Tsilefy.

    Et puis problème de la durée de vie de ma session toujours pas résolu.

  8. #8
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Boulet man... j'avais fait une copie de mon fichier, mais le "action" du formulaire appelait toujours l'ancien.

    Voila le pourquoi de l'erreur: 1 problème de résolu.

    Reste donc a faire
    1) Que lorsque qu'on quitte une partie en cours et qu'on y revient dessus un peu plus tard, la partie n'est pas bougé.
    Je pensais que mettre "session_start();" après la déclaration de ma classe allait suffire mais apparemment non...
    J'utilise WampServer (je sais pas si c'est utilise de le préciser)
    Quelqu'un a t'il la réponse ou une explication à ce problème?

  9. #9
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Une session est détruite à la fermeture du navigateur quoi qu'il advienne.
    Donc ce n'est pas le stockage en session qui va te permettre de répondre totalement à cet énoncé.
    Tu peux utiliser un cookie pour stocker les informations importantes et régénérer ton instance de Mastermind en fonction des informations dans le cookie.
    A noter tout de même qu'un cookie peut être modifié par l'utilisateur.

    Sinon il faut générer un numéro de partie et enregistrer le jeu dans une base de données.
    Et ne stocker dans le cookie que le numéro de partie.

  10. #10
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    Justement, je ne ferme pas mon navigateur.
    Je suis sur ma page en train de jouer, je vais visiter un autre site et je reviens directement sur ma page, et là tout a été réinitialisé.

    Regardez, ça fonctionne sur cette page : http://www.lirmm.fr/~meynard/ArchiToile/master.php
    Quand on quitte la page et qu'on y revient dessus (sans fermer le navigateur), la page n'a pas bougé.

    Je souhaiterais avoir le même résultat.

    Sinon pour ce qui est des cookies, je note, mais ça sera l'objet d'un prochain TP.

  11. #11
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (!(isset($_POST['proposition']))) { // si j'arrive la premiere fois sur la page
    		$_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    		$_SESSION['mastermind']->afficheTableauJeu();		
     
    	}
    En gros quoi qu'il advienne si tu n'as rien dans $_POST tu écrases ce qu'il y a dans ta session.
    Il te faut rajouter une condition pour que si $_SESSION['mastermind'] n'est pas vide tu le réutilises plutôt que l'écraser.

  12. #12
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 118
    Par défaut
    transgohan


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (isset($_SESSION['mastermind']) && !(isset($_POST['proposition']))) { // si je veux reprendre la partie de ma session en cours
    	$_SESSION['mastermind']->afficheTableauJeu();
    }
    else if(!(isset($_POST['proposition']))) { // si j'arrive la premiere fois sur la page
    	$_SESSION['mastermind'] = new Mastermind(); // je genere une instance de Mastermind et son code dans la session
    	$_SESSION['mastermind']->afficheTableauJeu();
    }
    It works!
    Un grand merci à toi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Servlets - JSP] Problème de session
    Par the java lover dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/11/2011, 10h54
  2. [JSP][session] perte de session et sendRedirect
    Par blaz dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 30/03/2007, 10h32
  3. Réponses: 12
    Dernier message: 24/09/2003, 16h26
  4. [XMLRAD] session
    Par jml dans le forum XMLRAD
    Réponses: 4
    Dernier message: 17/12/2002, 10h24

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