[RESOLU] Problème session, admin/membre

Eléphanteau du PHP | 24 Messages

22 oct. 2016, 11:03

Bonjour, je continu toujours mon espace membre et j'ai ce problème qui se présente.

En tant qu'admin, je me connecte et j'arrive sur ma page admin/index.php

en tant que membre, je me connecte et j'arrive sur membre/index.php mais si depuis ma session membre, je veux accéder à l'espace admin il n'y à pas de problème, je peux le faire alors que je devrais directement être reconduit sur mon espace membre.

Pour info dans ma table j'ai un champ level en int qui est par défaut null, donc 1 = Admin.


Merci de votre aide .

Voici les codes

login.php
<?php
/* Indique le bon format des entêtes (par défaut apache risque de les envoyer au standard ISO-8859-1)*/
header('Content-type: text/html; charset=UTF-8');

/* Initialisation de la variable du message de réponse*/
$message = null;

/* Récupération des variables issues du formulaire par la méthode post*/
$mail = filter_input(INPUT_POST, 'mail');
$mdp = filter_input(INPUT_POST, 'mdp');

/* Si le formulaire est envoyé*/
if (isset($mail,$mdp)) 
{
    
    /* Teste que les valeurs ne sont pas vides ou composées uniquement d'espaces */  
    $mail = trim($mail) != '' ? $mail : null;
    $mdp = trim($mdp) != '' ? $mdp : null;
  
  
  /* Si $mail et $pass différents de null */
  if(isset($mail,$mdp)) 
  {
    /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
    A MODIFIER avec vos valeurs */
    $hostname = "localhost";
    $database = "prendrerdv";
    $username = "root";
    $password = "";
    
    /* Configuration des options de connexion */
    
    /* Désactive l'éumlateur de requêtes préparées (hautement recommandé) */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    
    /* Active le mode exception */
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    
    /* Indique le charset */
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
    
    /* Connexion */
    try
    {
      $connect = new PDO('mysql:host='.$hostname.';dbname='.$database, $username, $password, $pdo_options);
    }
    catch (PDOException $e)
    {
      exit('problème de connexion à la base');
    }    
    
    /* Requête pour récupérer les enregistrements répondant à la clause : champ du mail et champ du mdp de la table = mail et mdp posté dans le formulaire */
    $requete = "SELECT * FROM clients WHERE mail = :mail AND mdp = :mdp AND level = :level";  
    
    try
    {
     /* Préparation de la requête*/
            $req_prep = $connect->prepare($requete);

            /* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
            $req_prep->execute(array(':mail'=>$mail,':mdp'=>$mdp, ':level'=>1));

            /* Création du tableau du résultat avec fetchAll qui récupère tout le tableau en une seule fois*/
            $resultat = $req_prep->fetchColumn();

            $nb_result = count($resultat);

            if ($nb_result == 1)
            {
                /* Démarre une session si aucune n'est déjà existante et enregistre le mail dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter.  */

                if (!session_id()) session_start();
                $_SESSION['login'] = $mail;
                $_SESSION['level'] = $resultat;

                $message = 'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';

        if($resultat ==1) {
                    header('Location: admin/index.php');
                }else {
                    header('Location: membre/index.php');
                }

      
  

      }
      else if ($nb_result > 1)
      {
        /* Par sécurité si plusieurs réponses de la requête mais si la table est bien construite on ne devrait jamais rentrer dans cette condition */
        $message = 'Problème de d\'unicité dans la table';
      }
      else
      {   /* Le mail ou le mot de passe sont incorrect */
        $message = 'Le mail ou le mot de passe sont incorrect';
      }
    }
    catch (PDOException $e)
    {
      $message = 'Problème dans la requête de sélection';
    }	
  }
  else 
  {/*au moins un des deux champs "mail" ou "mot de passe" n'a pas été rempli*/
    $message = 'Les champs mail et Mot de passe doivent être remplis.';
  }
}
?>

admin/index.php


<?php
session_start();
if (!isset($_SESSION['login'])) {
    header('Location: ../login.php');
	if(!empty($_SESSION['level'])) {
   if ($level ==1) {
                    header('Location: admin/index.php');
}
    

else {
    header('Location: membre/index.php');
	
	}
}
    exit;
	
} else {
    $bdd = new PDO('mysql:host=localhost;dbname=prendrerdv;charset=utf8', 'root', '');
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $bdd->prepare('SELECT * FROM clients WHERE mail = :mail');
    $stmt->bindParam('mail', $_SESSION['mail'], PDO::PARAM_INT);
    $stmt->execute();
    $user = $stmt->fetch();

	echo'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';
}
?>

Eléphanteau du PHP | 22 Messages

22 oct. 2016, 12:11

Bonjour,
tu as vérifié la valeur de $level avec un echo

Eléphanteau du PHP | 24 Messages

22 oct. 2016, 20:30

Bonsoir et merci de ta réponse, je n'ai rien qui apparait avec echo, et si au lieu de level, je remplaçais pour me faciliter la vie par mon adresse mail, si $mail=monadresse mail, alors je peux accéder à l'espace admin sinon espace membre.

C'est possible à faire, j'ai déjà fais des tests mais rien de concluant... si quelqu'un peut m'aider ce serait cool ;)

Eléphanteau du PHP | 22 Messages

22 oct. 2016, 21:11

essayes:
echo"<pre>";
print_r($level) ;
echo"</pre>";
pour voir si la variable correspond à un tableau.

Eléphanteau du PHP | 24 Messages

22 oct. 2016, 22:16

Bon alors je me suis servis de ce code, qui était déjà présent. Si je me connecte avec ma session admin, la phrase affiche, Bonjour 1 ,vous êtes connecté, sur la page admin, si je me connecte avec la session membre, la phrase affiche Bonjour , vous êtes connecté

echo'Bonjour '.htmlspecialchars($_SESSION['level']).', vous êtes connecté';

une idée ?

Eléphanteau du PHP | 22 Messages

23 oct. 2016, 01:28

dans admin/index.php
exit;
au milieu des accolades

Eléphanteau du PHP | 24 Messages

23 oct. 2016, 10:23

Merci de ton aide, mais ça ne change rien du tout lol

sinon tu penses pas que le problème vient du $level dans la page login ? car j'ai l'impression qu'uon donne à $level, la valeur de $ resultat alors que c'est 2 choses différentes non ?

$requete = "SELECT * FROM clients WHERE mail = :mail AND mdp = :mdp AND level = :level";

try
{
/* Préparation de la requête*/
$req_prep = $connect->prepare($requete);

/* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
$req_prep->execute(array(':mail'=>$mail,':mdp'=>$mdp, ':level'=>$level));

/* Création du tableau du résultat avec fetchAll qui récupère tout le tableau en une seule fois*/
$resultat = $req_prep->fetchColumn();

$nb_result = count($resultat);

if ($nb_result == 1)
{
/* Démarre une session si aucune n'est déjà existante et enregistre le mail dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter. */

if (!session_id()) session_start();
$_SESSION['login'] = $mail;
$_SESSION['level'] = $resultat;

echo $mail;
$message = 'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';

if($resultat ==1) {
header('Location: admin/index.php');
}else {
header('Location: membre/index.php');
}

Eléphanteau du PHP | 22 Messages

23 oct. 2016, 12:43

$_SESSION['level'] = $resultat[2]; ( si level en troisième position, la première position vaut 0)
tu peux regarder $resultat:
echo"<pre>";
print_r($resultat) ;
echo"</pre>";
utilise $_SESSION['level'] et non $level car en changeant de page tu perds la variable mais pas en variable de session.

il faut prendre l’habitude de regarder la valeur des variables pas de devinettes!

Eléphanteau du PHP | 24 Messages

23 oct. 2016, 19:25

tu as bien raison ;) mais ça donne rien ... je désespère lol

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 oct. 2016, 13:07

salut,

le problème
$_SESSION['level'] = $resultat;

devrait être
$_SESSION['level'] = $resultat['level'];


if(!empty($_SESSION['level'])) {
if ($level ==1) {

$level n'existe pas ;)
il faut utiliser $_SESSION['level'] tout le temps.

si cette variable n'est affectée que pour un admin, il est possible de vérifier si elle existe seulement sur la page admin

par exemple pour vérifier sur la page admin que c'est bien un admin de connecté :
<?php
session_start();
if(empty($_SESSION['level'] ||  $_SESSION['level'] != 1) {
     header('Location: membre/index.php');
}

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

26 oct. 2016, 09:04

Ha merci Moogli, je test ça ce soir ;)

Eléphanteau du PHP | 24 Messages

26 oct. 2016, 21:55

Désolé Moogli, petit problème Parse error: syntax error, unexpected '{' in C:\wamp\www\admin\index.php on line 4 ... mais je pense que que le problème vient également de la page loggin.php non ? ici

if (!session_id()) session_start();
$_SESSION['login'] = $mail;
$_SESSION['level'] = $resultat;

$ session level ne peut être égal à $ resultat, puisque level est une valeur qu'on va directement chercher dans la table et comme par defaut si l'utilisateur est conecté, $ resultat=1 on force $level à être égal 1. Non ?

merci en tout cas de ton aide précieuse :)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 oct. 2016, 10:48

alors pour l'erreur c'est parce qu'il manque une ) dans le code que je t'ai fournis.
c'est bien de lire et comprendre avant de copier / coller ;)
$ session level ne peut être égal à $ resultat, puisque level est une valeur qu'on va directement chercher dans la table et comme par defaut si l'utilisateur est conecté, $ resultat=1 on force $level à être égal 1. Non ?
je ne l'a pas inventer c'est dans ton code
if (!session_id()) session_start();
$_SESSION['login'] = $mail;
$_SESSION['level'] = $resultat;
or $resultat c'est un tableau rien a voir avec une colonne de la table.
du coup, comme je l'indique dans le message précédent, $_SESSION['level'] = $resultat['level'];

la valeur ne doit pas forcée elle doit venir de ta base de données (sinon elle sert à rien la base et tu ne pourras différencier les utilisateurs ;) )


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 24 Messages

27 oct. 2016, 14:16

Oui c'est pour ça que j'essaye de cogiter sur le problème car j'essaye
d'adapter le script à mes besoins lol


Forum
Accueil du forum » PHP » PHP débutant
Envoyer par courrier électronique le sujet
Aperçu avant impression
Notifications
Problème session, admin/membre

Résolu ?
13 messages • Page 1 sur 1
Outils Du Sujet
flolegueu
Bonjour, je continu toujours mon espace membre et j'ai ce problème qui se présente.

En tant qu'admin, je me connecte et j'arrive sur ma page admin/index.php

en tant que membre, je me connecte et j'arrive sur membre/index.php mais si depuis ma session membre, je veux accéder à l'espace admin il n'y à pas de problème, je peux le faire alors que je devrais directement être reconduit sur mon espace membre.

Pour info dans ma table j'ai un champ level en int qui est par défaut null, donc 1 = Admin.


Merci de votre aide .

Voici les codes

login.php
<?php
/* Indique le bon format des entêtes (par défaut apache risque de les envoyer au standard ISO-8859-1)*/
header('Content-type: text/html; charset=UTF-8');

/* Initialisation de la variable du message de réponse*/
$message = null;

/* Récupération des variables issues du formulaire par la méthode post*/
$mail = filter_input(INPUT_POST, 'mail');
$mdp = filter_input(INPUT_POST, 'mdp');

/* Si le formulaire est envoyé*/
if (isset($mail,$mdp)) 
{
    
    /* Teste que les valeurs ne sont pas vides ou composées uniquement d'espaces */  
    $mail = trim($mail) != '' ? $mail : null;
    $mdp = trim($mdp) != '' ? $mdp : null;
  
  
  /* Si $mail et $pass différents de null */
  if(isset($mail,$mdp)) 
  {
    /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
    A MODIFIER avec vos valeurs */
    $hostname = "localhost";
    $database = "prendrerdv";
    $username = "root";
    $password = "";
    
    /* Configuration des options de connexion */
    
    /* Désactive l'éumlateur de requêtes préparées (hautement recommandé) */
    $pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    
    /* Active le mode exception */
    $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    
    /* Indique le charset */
    $pdo_options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
    
    /* Connexion */
    try
    {
      $connect = new PDO('mysql:host='.$hostname.';dbname='.$database, $username, $password, $pdo_options);
    }
    catch (PDOException $e)
    {
      exit('problème de connexion à la base');
    }    
    
    /* Requête pour récupérer les enregistrements répondant à la clause : champ du mail et champ du mdp de la table = mail et mdp posté dans le formulaire */
    $requete = "SELECT * FROM clients WHERE mail = :mail AND mdp = :mdp AND level = :level";  
    
    try
    {
     /* Préparation de la requête*/
            $req_prep = $connect->prepare($requete);

            /* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
            $req_prep->execute(array(':mail'=>$mail,':mdp'=>$mdp, ':level'=>1));

            /* Création du tableau du résultat avec fetchAll qui récupère tout le tableau en une seule fois*/
            $resultat = $req_prep->fetchColumn();

            $nb_result = count($resultat);

            if ($nb_result == 1)
            {
                /* Démarre une session si aucune n'est déjà existante et enregistre le mail dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter.  */

                if (!session_id()) session_start();
                $_SESSION['login'] = $mail;
                $_SESSION['level'] = $resultat;

                $message = 'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';

        if($resultat ==1) {
                    header('Location: admin/index.php');
                }else {
                    header('Location: membre/index.php');
                }

      
  

      }
      else if ($nb_result > 1)
      {
        /* Par sécurité si plusieurs réponses de la requête mais si la table est bien construite on ne devrait jamais rentrer dans cette condition */
        $message = 'Problème de d\'unicité dans la table';
      }
      else
      {   /* Le mail ou le mot de passe sont incorrect */
        $message = 'Le mail ou le mot de passe sont incorrect';
      }
    }
    catch (PDOException $e)
    {
      $message = 'Problème dans la requête de sélection';
    }	
  }
  else 
  {/*au moins un des deux champs "mail" ou "mot de passe" n'a pas été rempli*/
    $message = 'Les champs mail et Mot de passe doivent être remplis.';
  }
}
?>


admin/index.php

<?php
session_start();
if (!isset($_SESSION['login'])) {
    header('Location: ../login.php');
  if(!empty($_SESSION['level'])) {
   if ($level ==1) {
                    header('Location: admin/index.php');
}
    

else {
    header('Location: membre/index.php');
  
  }
}
    exit;
  
} else {
    $bdd = new PDO('mysql:host=localhost;dbname=prendrerdv;charset=utf8', 'root', '');
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $bdd->prepare('SELECT * FROM clients WHERE mail = :mail');
    $stmt->bindParam('mail', $_SESSION['mail'], PDO::PARAM_INT);
    $stmt->execute();
    $user = $stmt->fetch();

  echo'Bonjour '.htmlspecialchars($_SESSION['login']).', vous êtes connecté';
}
?>
Bernard_2102
Bonjour,
tu as vérifié la valeur de $level avec un echo
flolegueu
Bonsoir et merci de ta réponse, je n'ai rien qui apparait avec echo, et si au lieu de level, je remplaçais pour me faciliter la vie par mon adresse mail, si $mail=monadresse mail, alors je peux accéder à l'espace admin sinon espace membre.

C'est possible à faire, j'ai déjà fais des tests mais rien de concluant... si quelqu'un peut m'aider ce serait cool ;)
Bernard_2102
essayes:
echo"<pre>";
print_r($level) ;
echo"</pre>";


pour voir si la variable correspond à un tableau.
flolegueu
Bon alors je me suis servis de ce code, qui était déjà présent. Si je me connecte avec ma session admin, la phrase affiche, Bonjour 1 ,vous êtes connecté, sur la page admin, si je me connecte avec la session membre, la phrase affiche Bonjour , vous êtes connecté

echo'Bonjour '.htmlspecialchars($_SESSION['level']).', vous êtes connecté';

une idée ?
Bernard_2102
dans admin/index.php
exit;
au milieu des accolades
flolegueu
Merci de ton aide, mais ça ne change rien du tout lol

sinon tu penses pas que le problème vient du $level dans la page login ? car j'ai l'impression qu'uon donne à $level, la valeur de $ resultat alors que c'est 2 choses différentes non ?

$requete = "SELECT * FROM clients WHERE mail = :mail AND mdp = :mdp AND level = :level";

try
{
/* Préparation de la requête*/
$req_prep = $connect->prepare($requete);

/* Exécution de la requête en passant les marqueurs et leur variables associées dans un tableau*/
$req_prep->execute(array(':mail'=>$mail,':mdp'=>$mdp, ':level'=>$level));

/* Création du tableau du résultat avec fetchAll qui récupère tout le tableau en une seule fois*/
$resultat = $req_prep->fetchColumn();

$nb_result = count($resultat);

if ($nb_result == 1)
{
/* Démarre une session si aucune n'est déjà existante et enregistre le mail dans la variable de session $_SESSION['login'] qui donne au visiteur la possibilité de se connecter. */

if (!session_id()) session_start();
$_SESSION['login'] = $mail;
$_SESSION['level'] = $resultat;

Regarde je prend la valeur level et je dis qu'elle est égale à $level et ensuite je si $mail et $mdp sont égaux au valeur rentré dans le.formulaire donc $resultat=1 et ensuite je fais comment ? J'ouvre la session je récupère l'adresse mail et je verifie si $level que j'ai récupéré plus haut dans ma base est égale ou diffèrent de 1 ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 oct. 2016, 15:20

ton dernier message est incompréhensible.

Je t'es fournis la solution, as toi de l'appliquée.
une chose est certain le niveau doit être dans une variable de session et cette variable doit être affectée à la connexion. Le code que j'ai fournit sur mon dernier message corrige ce que tu as fait dans ce sens.


@+
Il en faut peu pour être heureux ......