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 sur plusieurs pages


Sujet :

Langage PHP

  1. #1
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut Session sur plusieurs pages
    Bonsoir,

    Je travaille actuellement sur un projet web, et pour une adminstration je voudrais utiliser les sessions.

    Il y a un fichier index.php, et mes pages sont tout simplement des fonctions présent dans la page index.php.

    Quand je vais sur ma page index.php, il m'affiche ma fonction index(). Il affiche le formulaire pour s'identifier et ensuite affiche la fonction index qui est caché si on es pas identifier.

    Malheureusement quand je clic dans ma page caché vers une autre page, la fonction p2()(qui devrait être une deuxieme page) ne s'affiche pas mais le formulaire d'identification et quand je le remplis je retombe sur ma fonction index().

    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
    <?php
    session_start();
     
    $_SESSION['connect'] = 0;
     
    define('CHECK_INDEX', TRUE);
     
    include('global.php');
     
    echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'
    	.'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">'
    	.'<head>'
    	.'<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />'
    	.'<meta http-equiv="content-style-type" content="text/css" />'
    	.'<title>Ecrire - '.$projet['site_name'].'</title>'
    	.'<link rel="stylesheet" type="text/css" href="style/style.css"/>'
    	.'</head>'
    	.'<body>';
     
    echo '<div id="header"><div id="header-logo"></div></div>';
     
    if(!empty($_GET['Deconnexion']))
    {
    	$_SESSION = array();
    	if (isset($_COOKIE[session_name()]))
    	{
    		setcookie(session_name(),'',time()-4200,'/');
    	}
     
    	session_destroy();
    }
    elseif(!empty($_GET['P2']))
    {
    	p2();
    }
    else
    {
     
    		index();
    }
     
    function index()
    {
     
    	if(isset($_POST['login']) && isset($_POST['passe']))
    	{
    		$login = $_POST['login'];
    		$passe = $_POST['passe'];
    		$postconnexion = 1; 
    	}
    	else
    	{
    		$login = '';
    		$passe = '';
    	}
     
    	if($login == 'Plougy' && $passe == 'passe')
    	{
    		$_SESSION['connect'] = 1;
    		session_register('login', 'passe');
     
    	echo '<div id="contenu">';
     
    echo '<div id="deconnexion">'.$login.'<br /><a href="index.php?Deconnexion">Déconnexion</a></div><br /><div style="text-align: center;"><h1>Administration</h1></div>';
     
    	echo '<div style="text-align:center;"><a href="index.php?P2">Page 2</a></div>';
     
    	echo '</div>'; // FIN CONTENU
    }
    else
    {	
    	echo '<div id="contenu">';
     
    	if($postconnexion)
    	{
    		echo '<div id="connexion-erreur">Une erreur est survenue</div><br />';
    	}
    	echo '<strong>Connection à l\'administration</strong>';
    	echo'<form action="index.php" method="post">'
    	.'<p class="pclickform"><label for="login">Votre login :</label><input type="text" name="login" id="login"/></p>'
    	.'<p class="pclickform"><label for="passe">Votre passe :</label><input type="password" name="passe" id="passe"/></p>'
    	.'<p class="pclickform"><input type="submit" value="Valider"/></p>'
    	.'</form>';
     
    	echo '</div>';
    }
    }
     
    function p2()
    {
    if (isset($_SESSION['connect']))//On vérifie que le variable existe
    {
            $connect=$_SESSION['connect'];//On récupère la valeur de la variable de session
    }
    else
    {
            $connect=0;//Si $_SESSION['connect'] n'existe pas, on donne la valeur "0"
    }
     
    if ($connect == 1) // Si le visiteur s'est identifié
    {
    	echo '<div style="text-align:center;"><h2> Page 2 </h2></div>';
    }
    }
     
    echo '</body>'
    	.'</html>';
    ?>
    Je voudrais me connecter une seul fois, et ensuite aller dans les pages que je veux dans mon administration et quand j'ai fini me déconnecter.

    Merci

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Votre variable de session connect est écrasée à chaque appel de la page via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['connect'] = 0;
    Sachant que vous testez son existence pour savoir si vous êtes ou non connectés elle n'est pas vraiment nécessaire. Si vous souhaitez la définir si ce n'est pas déjà le cas ajoutez un test avec (!)isset avant.

  3. #3
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Citation Envoyé par julp
    Votre variable de session connect est écrasée à chaque appel de la page via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['connect'] = 0;
    Sachant que vous testez son existence pour savoir si vous êtes ou non connectés elle n'est pas vraiment nécessaire. Si vous souhaitez la définir si ce n'est pas déjà le cas ajoutez un test avec (!)isset avant.
    J'ai enlevé la variable au début, mais rien ne ce passe...


  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Je crois avoir trouvé un test erroné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(!empty($_GET['P2']))
    Celui ci-dessous serait plus approprié car ce paramètre ne prend pas de valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(isset($_GET['P2']))
    Note : la fonction session_register est dépréciée (utilisez plutôt $_SESSION['login'] = $passe;) et $postconnexion n'est pas définie au début ($postconnexion = 0; à ajouter dans le else ?).

  5. #5
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Citation Envoyé par julp
    Je crois avoir trouvé un test erroné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(!empty($_GET['P2']))
    Celui ci-dessous serait plus approprié car ce paramètre ne prend pas de valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    elseif(isset($_GET['P2']))
    Note : la fonction session_register est dépréciée (utilisez plutôt $_SESSION['login'] = $passe et $postconnexion n'est pas définie au début ($postconnexion = 0; à ajouter dans le else ?).
    Oh je vous remercie fort !

    Sinon, comment savoir la prochaine fois lequel utiliser la prochaine fois entre isset et !empty ?

    Merci

  6. #6
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Une question me vient maintenant que j'ai réglé le plus gros problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	if(isset($_POST['login']) && isset($_POST['passe']))
    	{
    		$login = $_POST['login'];
    		$passe = $_POST['passe'];
    		$postconnexion = 1; 
    	}
    Dans ma fonction index() je récupère le $_POST['login'] et le $_POST['passe'], je voudrais savoir comment faire pour supprimer ce POST après les avoir récupérer (Si cela est possible).

    Car quand je rafraichis ma page caché, il me dit qu'elle contient des données envoyer par POST, et j'aime pas trop ça...

    Merci

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par Plougy
    Sinon, comment savoir la prochaine fois lequel utiliser la prochaine fois entre isset et !empty ?
    Attention à empty effectivement : isset teste uniquement l'existence d'une variable (a-t-elle été définie ?). En revanche, empty vous renverra FALSE si :
    • la variable n'est pas définie (le seul point commun avec isset) ou
    • la variable peut être interprétée comme une valeur nulle : la chaîne vide, FALSE, NULL, un tableau vide, une valeur numérique entière ou décimale nulle (0, 0.0, etc) ou la valeur entière nulle sous forme de chaîne (ie : '0')


    Le but était de savoir si $_GET['P2'] était ou non définie. Sa valeur nous importe peu puisqu'elle n'est pas utilisée et par conséquent empty, dans tous les cas, vous renvoyait FALSE car soit elle n'est pas définie soit c'est une chaîne vide.

    Citation Envoyé par Plougy
    je voudrais savoir comment faire pour supprimer ce POST après les avoir récupérer (Si cela est possible).
    C'est le navigateur qui vous les renvoie donc côté serveur il faudrait faire une redirection ou utiliser la session (mais dans votre cas ça ne présente pas de réel intérêt).

  8. #8
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Je vous remercie pour l'explication.

    J'ai trouver un petite erreur, mais je ne sais pas vraiment comment la résoudre...

    Quand je clic sur des liens (exemple : index.php?Preferences ) qui se trouve dans mon index ou autre page il les affiches, mais quand je fais un lien tout court vers index.php il m'affiche le formulaire d'inscription...

    Comment résoudre ce problème ?

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    La session existe bien la deuxième fois que vous passez par index.php tout court mais ces variables ne sont pas testées/utilisées c'est pourquoi vous retrouvez le formulaire. Etait-ce bien votre question ?

  10. #10
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Je voulais savoir comment faire pour éviter d'avoir le formulaire quand je clic sur un lien qui est censé ramener à l'accueil.

    Merci

  11. #11
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    C'est bien ce que je disais

    Remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	if($login == 'Plougy' && $passe == 'passe')
    	{
    Par exemple, en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	if((isset($_SESSION['connect']) && $_SESSION['connect'] == 1) xor ($login == 'Plougy' && $passe == 'passe'))
    	{
    		if (!isset($_SESSION['login'])) {
    			$_SESSION['connect'] = 1;
    			$_SESSION['login'] = $passe;
    		}

  12. #12
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Bonsoir,

    J'ai réussi à faire que quand je clic sur un lien index.php ça ne renvoit pas le formulaire.

    Sinon je rencontre un soucis maintenant, sur la connexion via une BDD. Il n'arrive pas à me connecté, mon script n'est il pas bon ?

    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
    function index()
    {
    	global $projet;
    	if(isset($_POST['login']) && isset($_POST['passe']))
    	{
    		$login = $_POST['login'];
    		$passe = $_POST['passe'];
    		$postconnexion = 1; 
    	}
    	else
    	{
    		$login = '';
    		$passe = '';
    	}
     
    	$sql = 'SELECT * FROM '.$projet['prefix'].'_user ORDER BY user';
    	$req = mysql_query($sql) or die(mysql_error());
     
    	while ($donnees = mysql_fetch_array($req))
    	{
    		$user = $donnees['user'];
    		$password = md5($donnees['password']);
    	}
     
     	if(($login == $user && $passe == $password) or (isset($_SESSION['connect']) && $_SESSION['connect'] == 1))
    	{
    		if($login == $user && $passe == $password){
    			$_SESSION['connect'] = 1;
    			$_SESSION['login'] = $login;
    		}
     
    		$login = $GLOBALS['login'];	
     
     
    echo '<div id="menu"><a href="index.php">#Main</a></div><div id="deconnexion">'.$login.'<br /><a href="index.php?Deconnexion">Déconnexion</a></div><br /><div style="text-align: center;"><h1>Administration</h1>';
    Merci

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    ça ne sert strictement à rien de parcourir toute la table surtout en la triant. Utilisez la clause WHERE pour ne sélectionner que les enregistrements qui correspondent à ces login/mot de passe et la fonction d'aggrégation COUNT qui vous permet de savoir combien y correspondent (normalement c'est un seul ou aucun) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	$sql = 'SELECT COUNT(*) FROM '.$projet['prefix'].'_user WHERE user=\'' . mysql_real_escape_string($login) . '\' AND password = \'' . md5($password) . '\'';
    	$req = mysql_query($sql) or die(mysql_error());
    	$res = mysql_fetch_row($req);
     
     	if($res[0] == 1 or ...) {
    Mais il faudrait revoir vos tests : inutile de faire la requête si les variables $login et $passe sont initialisées à vide.

    Quant au problème sur la variable $login, c'est sans doute dû à la ligne ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $login = $GLOBALS['login'];
    Je ne sais pas ce que vous cherchez à faire avec celle-ci

    Recommandation : développez avec error_reporting à E_ALL (pour PHP 5 à E_ALL|E_STRICT serait encore mieux) qui vous mettra tout de suite la puce à l'oreille lorsque quelque chose ne va pas du fait des messages d'erreurs affichés et votre code en sera d'autant plus propre.

  14. #14
    Membre averti
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Par défaut
    Citation Envoyé par julp
    ça ne sert strictement à rien de parcourir toute la table surtout en la triant. Utilisez la clause WHERE pour ne sélectionner que les enregistrements qui correspondent à ces login/mot de passe et la fonction d'aggrégation COUNT qui vous permet de savoir combien y correspondent (normalement c'est un seul ou aucun) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	$sql = 'SELECT COUNT(*) FROM '.$projet['prefix'].'_user WHERE user=\'' . mysql_real_escape_string($login) . '\' AND password = \'' . md5($password) . '\'';
    	$req = mysql_query($sql) or die(mysql_error());
    	$res = mysql_fetch_row($req);
     
     	if($res[0] == 1 or ...) {
    Mais il faudrait revoir vos tests : inutile de faire la requête si les variables $login et $passe sont initialisées à vide.
    J'ai réussi avant votre réponse, j'y ai apporté des modifications avec votre réponse (comme pour éviter de tout parcourir).

    Et la requête, je l'ai déplacé pour éviter de la faire s'il n'y a pas de variable $login et $passe.

    Citation Envoyé par julp
    Quant au problème sur la variable $login, c'est sans doute dû à la ligne ci-dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $login = $GLOBALS['login'];
    Je ne sais pas ce que vous cherchez à faire avec celle-ci
    Sa sert à afficher l'identifier dans l'administration.

    Merci pour toutes vos réponses et votre aide précieuse dans l'avancement de mon projet.


    Plougy

  15. #15
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Citation Envoyé par Plougy
    J'ai réussi avant votre réponse, j'y ai apporté des modifications avec votre réponse (comme pour éviter de tout parcourir).

    Et la requête, je l'ai déplacé pour éviter de la faire s'il n'y a pas de variable $login et $passe.


    Citation Envoyé par Plougy
    Sa sert à afficher l'identifier dans l'administration.

    Merci pour toutes vos réponses et votre aide précieuse dans l'avancement de mon projet.
    Autant pour moi, n'ayant pas copié/collé le début, j'avais omis que cette instruction figurait dans une fonction.

    La fonction index() doit être appelée avant d'utiliser $login en dehors de celle-ci (sauf que cette fonction n'est pas toujours appelée). N'oubliez pas que vous y avez normalement accès directement via la session ($_SESSION['login']).

Discussions similaires

  1. [Session] Problème de gestion sur plusieurs pages
    Par GLDavid dans le forum Tomcat et TomEE
    Réponses: 8
    Dernier message: 11/10/2006, 17h02
  2. [Struts]Affiche d'une liste sur plusieurs pages
    Par guillaume_85 dans le forum Struts 1
    Réponses: 3
    Dernier message: 24/06/2005, 21h23
  3. [CR?] Tableaux sur plusieurs pages
    Par Nout dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 18/05/2005, 15h58
  4. [JSP] affichage de resultat sur plusieurs pages
    Par de LANFRANCHI dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 10/02/2005, 11h00
  5. [CR8] Problème tableau sur plusieurs pages???
    Par christophe28 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/11/2004, 16h46

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