Gestion du menu suivant le membre connecté - Toi y a être ADMIN toi y a droit !!

Eléphant du PHP | 122 Messages

07 oct. 2008, 15:51

BoNjOuR,

Voici le défis du jour !!!

J'ai deux pages pour gérer mes menus.

La première dont voici le script, qui m'affiche le menu principal dans ma page d'index (MenuIndex.php):
	<?php
		//echo $_GET['ecl'];
		if(empty($_GET['ecl']))
		{
			$ecl= 0 ;
		}
		else	{ 
				$ecl = $_GET['ecl'];
				}
		//echo $_GET['ecl']; 
		?>
       
    <ul>
      <!-- le # du href="#" est à remplacer par le lien qui va bien :-) -->
      <li><a href="Formulaire/Connexion/Connexion-ok.php" target="_self">Connexion V.I.P</a><br/></li>
	  <li><a href="Pages/Dons.php" target="_self">Faire un don</a><br/></li>
	  <li><a href="Pages/Liste_Article_Admin.php" target="_self">Lister les articles - RESERVE ADMIN</a></li>
	  <li><a href="Pages/Propos_Article_Admin.php" target="_self">Proposer un article - RESERVE ADMIN</a></li>
	  <li><a href="Admin/Sauvegarde_BDD.php" target="_self">Sauvegarde des BDD - RESERVE ADMIN</a></li>
	  <li><a href="Pages/Propos_article.php" target="_self">Proposer un article ou une news</a></li>
	  <li><a href="Pages/Fibromyalgie.php?ecl=1" target="_self">La Fibromyalgie</a></li>    
	  </ul>
Et la deuxième page, celle qui en fonction de la ligne cliquer précédemment affiche le contenu du sous-menu s'il y en a un (MenuPages.php):
<?php
		//echo $_GET['ecl'];
		if(empty($_GET['ecl']))	{
				$ecl= 0 ;
			} else { 
				$ecl = $_GET['ecl'];
			}
		//echo $_GET['ecl']; 
		?>
       
    <ul>
      <!-- le # du href="#" est à remplacer par le lien qui va bien :-) -->
      <li><a href="../Index.php">Accueil</a><br/><br/>
	  <li><a href="../Formulaire/Connexion/Connexion-ok.php" target="_self">Connexion V.I.P</a><br/></li>
      <li><a href="Dons.php">Faire un don</a><br/></li>
	  <li><a href="Liste_Article_Admin.php" target="_self">Lister les articles - RESERVE ADMIN</a></li>
	  <li><a href="Propos_Article_Admin.php" target="_self">Proposer un article - RESERVE ADMIN</a></li>
	  <li><a href="../Admin/Sauvegarde_BDD.php" target="_self">Sauvegarde des BDD - RESERVE ADMIN</a></li>	  
	  <li><a href="Propos_article.php" target="_self">Proposer un article ou une news</a></li>	  
      <li><a href="Fibromyalgie.php?ecl=1" target="_self">La Fibromyalgie</a></li>
      
	  <?php
	  if($ecl==1)
	  { ?>
      
	  <ul>
        <li><a href="../Pages/Differentescauses.php?ecl=1">Les différentes causes prouvées</a></li>
        <li><a href="../Pages/Armes.php?ecl=1">Armes biologiques</a></li>
		<li><a href="../Pages/Reconnaissance.php?ecl=1">Reconnaissance de la fibromyalgie</a></li>
		<li><a href="../Pages/Methodes.php?ecl=1">Les méthodes bienfaisantes</a></li>
	  </ul>
</ul>
J'aimerais savoir ce que je dois rajouter et où de façon à ce que lorsqu'un membre se connecte il puisse accéder aux 3 menus ou j'ai écris RESERVE ADMIN ????

Si quelqu'un à une idée ??

D'avance merci.

Et bravo à tout ceux qui vont osez relevez le défis du jour !!!

Mammouth du PHP | 1353 Messages

07 oct. 2008, 16:06

Bonjour,

Je ne vais pas relever le défi en te donnant le code pour faire cela mais je peux te donner des pistes :

L'idée dans ta base est de faire, via une colonne, la distinction entre un admin et un utilisateur "normal". Ensuite après l'authentification tu stockes dans une variable de session si l'utilisateur connecté est admin ou pas, par exemple $_SESSION["is_admin"] = true ou false ...

Enfin, lors de la création du menu, tu affiches les valeurs en fonction de cette variable :
<ul>
<li>Menu1</li>
<li>Menu2</li>
<?php if($_SESSION["is_admin"]) echo "<li>Menu3</li>";?>
</ul>
Bien sur, sur les pages réservées aux admins il faudra refaire cette verification et redirigé les utilisateurs si ils n'ont pas le droit d'admin....
Tell me and I forget. Teach me and I remember. Involve me and I learn.

Invité
Invité n'ayant pas de compte PHPfrance

07 oct. 2008, 16:18

Ouais c'est bien comme ça que j'avais pensé, avec les sessions ...

Mais je ne savais pas trop comment le mettre en place ...

Je vais essayer de mettre en application ce que tu m'a écris ...

Eléphant du PHP | 122 Messages

07 oct. 2008, 16:24

C'est fait pour la BDD, j'ai ajouté une colonne grades et pour les differents membres j'ai ajouté soit "ADMIN" soit "MEMBRE"

Je vais passer au reste ...

Merci en tout cas

Eléphant du PHP | 122 Messages

07 oct. 2008, 23:20

Il faut que j'ajoute ce que tu m'as écris plus haut mais il faut peut etre que je fasse une requete en BDD pour aller chercher dans ma table membres tous les pseudo qui sont ADMIN ....

Qu'en penses-tu ???

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Eléphant du PHP | 451 Messages

07 oct. 2008, 23:48

Y a plus simple qu'une requête sql.

Dans ta table membre tu fais un champ level et au moment de la connexion du membre du regarde quel est le level du membre et après tu fais:
<?php
if($row['level'] == 1) // S'il est admin
{
     $_SESSION['level'] = 1;
}
else // Sinon
{
     $_SESSION['level'] = 0;
}
?>
Puis pour ton menu tu fais:
<?php
if($_SESSION['level'] == 1)
{
     echo 'ton lien admin';
}
?>
Bien-sûr $row['level'] est à remplacer par ce que tu as déjà mit à la connexion.

Eléphant du PHP | 122 Messages

08 oct. 2008, 08:04

Salut,

Et bien moi j'ai appelé ma colonne "grades" et les valeurs sont "ADMIN" ou "MEMBRE" mais je pense que "1" ou "0" sera plus simple tu as raison ...

Je vais essayer ça merci beaucoup de ton coup de main.

Bonne journée ... @ +

Eléphant du PHP | 122 Messages

08 oct. 2008, 13:12

Est-ce que ça le fait si je créér une page Menuindex-SPECIAL-ADMIN.php et une page Menupages-SPECIAL-ADMIN.php et je laisse les deux autres Menuindex.php et Manupages.php d'origine ...

Ainsi en fonction de :
if($_SESSION['grades'] == 1) 
Et bien je fais un include du menu qui va bien ???

Qu'en penses-tu, c'est peut etre un peu une usine à gaz que je suis en train de construire là non ???[/php]

------------------

EDIT:

Donc dans ma page formulaire_connex.php qui a ce code:
<?php
session_start();
// 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');

/* Création d'une fonction - utilisée dans la récupération des variables - qui teste la configuration get_magic_quotes_gpc du serveur.
Si oui, supprime avec la fonction stripslashes les antislashes "\" insérés dans les chaines de caractère des variables gpc (GET, POST, COOKIE) */
function Verif_magicquotes ($chaine) 
{
if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);

return $chaine;
} 

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

// Si le formulaire est envoyé
if (isset($_POST['inscr_pseudo'])) 
{

    /* Récupération des variables issues du formulaire
    Teste l'existence les données post en vérifiant qu'elles existent, qu'elles sont non vides et non composées uniquement d'espaces.
    (Ce dernier point est facultatif et l'on pourrait se passer d'utiliser la fonction trim())
    En cas de succès, on applique notre fonction Verif_magicquotes pour (éventuellement) nettoyer la variable */
    $pseudo = (isset($_POST['inscr_pseudo']) && trim($_POST['inscr_pseudo']) != '')? Verif_magicquotes($_POST['inscr_pseudo']) : null;
    $pass = (isset($_POST['inscr_pass']) && trim($_POST['inscr_pass']) != '')? Verif_magicquotes($_POST['inscr_pass']) : null;
    
    // Si $pseudo et $pass différents de null
    if(isset($pseudo,$pass)) 
    {
         /* Connexion au serveur : dans cet exemple, en local sur le serveur d'évaluation
         A MODIFIER avec vos valeurs */
         $hostname = "localhost";
         $database = "xxx";
         $username = "root";
         $password = "";
    
         $connection = mysql_connect($hostname, $username, $password) or die(mysql_error());

         // Connexion à la base
         mysql_select_db($database, $connection);
    
         // Indique à mySql de travailler en UTF-8 (par défaut mySql risque de travailler au standard ISO-8859-1)
         mysql_query("SET NAMES 'utf8'");
    
         // Préparation des données pour les requêtes à l'aide de la fonction mysql_real_escape_string
         $nom = mysql_real_escape_string($pseudo);
         $password = mysql_real_escape_string($pass);
        
		// Requête pour compter le nombre d'enregistrements répondant à la clause : champ du pseudo et champ du mdp de la table = pseudo et mdp posté dans le formulaire
        $requete = "SELECT count(*) as nb FROM membre WHERE inscr_pseudo = '".$nom."' AND inscr_pass = '".$password."'";  
	
         // Exécution de la requête
         $req_exec = mysql_query($requete) or die(mysql_error());
    
         // Création du tableau associatif du résultat
         $resultat = mysql_fetch_assoc($req_exec); 

         // nb est le nom de l'allias associé à count(*) et retourne le résultat de la requête dans le tableau $resultat; 
         if ($resultat['nb'] == 1) 
         // Résultat du comptage = 1 , le pseudo et le mot de passe sont correct
         {
             {
                 /* Démarre la session et enregistre le pseudo dans la variable de session $_SESSION['inscr_pseudo']
                 qui donne au visiteur la possibilité de se connecter.  */
                 session_start();
                 $_SESSION['inscr_pseudo'] = $pseudo;
                 //redirection vers la page que tu veux en cas de succès
                 header("Location: connexion_reussi.php");
                 exit(); 
             }    
         }
         else
         {   // Le pseudo ou le mot de passe sont incorrect
             $message = 'Le pseudo ou le mot de passe sont incorrect';
         }
	}
}
?>
Ce que je dois changer ce trouve à ce niveau là:
/* Démarre la session et enregistre le pseudo dans la variable de session $_SESSION['inscr_pseudo']
                 qui donne au visiteur la possibilité de se connecter.  */
                 session_start();
                 $_SESSION['inscr_pseudo'] = $pseudo;
                 //redirection vers la page que tu veux en cas de succès
                 header("Location: connexion_reussi.php");
                 exit(); 
Et là je pourrais mettre:
/* Démarre la session et enregistre le pseudo dans la variable de session $_SESSION['inscr_pseudo']
                 qui donne au visiteur la possibilité de se connecter.  */
                 session_start();
            if($row['grades'] == 1) // S'il est admin
           {
                $_SESSION['grades'] = 555;
           }
                else // Sinon
           {
                $_SESSION['grades'] = 666;
           }
                $_SESSION['inscr_pseudo'] = $pseudo;
                 //redirection vers la page que tu veux en cas de succès
                 header("Location: connexion_reussi.php");
                 exit(); 
Ca te parait pas trop bête ???

--------------------

RE-EDIT:

J'ai ajouté ceci en début de page Menuindex.php et Menupages.php:
<!-- Vérification du grade du membre -->
<?php
if($_SESSION['grades'] = 555)
{
     echo 'Bienvenue à toi honorable admin';
}

else // Sinon
{
     $_SESSION['grades'] = 666; // S'il n'est que membre
	 echo 'Tu n\'es pas admin';
}
?>

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<link href="../Design/stylemenu.css" rel="stylesheet" type="text/css" />
</head>

<body onload="MM_preloadImages('../Images/Structure/Bout_menu_select.gif')">
<!-- le onload permet de précharger l'image du bouton quand on est dessus ce qui évite au premier coup d'avoir un temps de latence -->
		<?php
		//echo $_GET['ecl'];
		if(empty($_GET['ecl']))
		{
			$ecl= 0 ;
		}
		else	{ 
				$ecl = $_GET['ecl'];
				}
		//echo $_GET['ecl']; 
		?>
    <ul>
      <!-- le # du href="#" est à remplacer par le lien qui va bien :-) -->
      <li><a href="Pages/Form_Connexion.php" target="_self">Connexion V.I.P</a><br/></li>
	  <li><a href="Pages/Dons.php" target="_self">Faire un don</a><br/></li>
	  <li><a href="Pages/Liste_Article_Admin.php" target="_self">Lister les articles - RESERVE ADMIN</a></li>
Mais il m'affiche tjs "Bienvenue à toi honorable admin" .... meme une fois firefox "purger" ....

Et si je met session_start il me remet le message d'erreur :

Code : Tout sélectionner

Cannot send session cache limiter - headers already sent (output started at C:\wamp\www\Index.php:8) in C:\wamp\www\Menu\MenuIndex.php on line
As-tu une idée ?

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
AB
ViPHP | 5818 Messages

08 oct. 2008, 19:13

La requête du tuto ne compte que le nombre d'enregistrements correspondants à la clause de la requête. Rien d'autre.

Or dans ton cas, en même temps que d'identifier l'utilisateur il faut que tu récupère des champs. Par simplicité on peut les sélectionner tous en utilisant '*'.

Regarde les différences et les commentaires par rapport au code précédent
        // Requête pour récupérer les enregistrements répondant à la clause : champ du pseudo et champ du mdp de la table = pseudo et mdp posté dans le formulaire
        $requete = "SELECT * FROM membre WHERE inscr_pseudo = '".$nom."' AND inscr_pass = '".$password."'";  
    
         // Exécution de la requête
         $req_exec = mysql_query($requete) or die(mysql_error());
    
         // Création du tableau associatif du résultat
         $resultat = mysql_fetch_assoc($req_exec); 

         // Les valeurs (si elles existent) sont retournées dans le tableau $resultat; 
         if (isset($resultat['inscr_pseudo'],$resultat['inscr_pass']))  

               {
                 session_start();
                 $_SESSION['inscr_pseudo'] = $pseudo;

                 // Si un champ 'grade' existe dans la bdd on l'enregistre dans  $_SESSION['grade'] sinon
                 // on affecte la valeur 0 (par exemple) à $_SESSION['grade']

                 $_SESSION['grade'] = isset($resultat['grade'])? $resultat['grade'] : 0;

                 //redirection vers la page que tu veux en cas de succès
                 header("Location: connexion_reussi.php");
                 exit();  
                }
                else
               {   // Le pseudo ou le mot de passe sont incorrect
                $message = 'Le pseudo ou le mot de passe sont incorrect';
                } 
De cette manière en même temps que d'identifier l'utilisateur tu récupère son grade dans $_SESSION['grade'] et tu pourrais récupérer d'autres champs de la même manière.

Dans ton code, $row['grades'] ne correspondait à rien du tout et c'est d'ailleurs bizarre que tu n'aies pas eu un message d'erreur à cette ligne.

Eléphant du PHP | 122 Messages

08 oct. 2008, 21:42

Ok donc j'ai fais le changement et là ça fonctionne bien par contre j'ai ce bout de script en debut de mes deux pages Menuindex.php et Menupages.php:
<!-- Vérification du grade du membre -->
<?php
if($_SESSION['grades'] = 1)
{
     echo 'Bienvenue à toi honorable admin';
}

else // Sinon
{
     $_SESSION['grades'] = 0; // S'il n'est que membre
	 echo 'Tu n\'es pas admin';
}
?>
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
<link href="../Design/stylemenu.css" rel="stylesheet" type="text/css" />
</head>
Mais il m'affiche toujours "Bienvenue à toi honorable admin" ...

je pensais qu'il afficherait "tu n'es pas admin" à la première visite sur le site et une fois loggué "bienvenue ... admin"

comme ça en fonction du grade j'affiche ou non le menu qui correspond ...

Qu'est-ce qui cloche ???

Avatar du membre
ViPHP
ViPHP | 3008 Messages

08 oct. 2008, 22:03

Tu as une erreur dans ton IF
if($_SESSION['grades'] == 1)

Eléphant du PHP | 122 Messages

08 oct. 2008, 22:18

Oups ...

J'ai changé le code:

C'est bon ça fonctionne maintenant il ne me reste plus qu'à afficher les lignes en plus si tu es admin ou pas ....

merci

ViPHP
AB
ViPHP | 5818 Messages

09 oct. 2008, 01:15

Et n'oublies pas de mettre session_start() pour pouvoir exploiter les variables de sessions. Cf mon dernier message dans ton topic http://www.phpfrance.com/forums/voir_reponse-265038.php

Au passage, si c'est résolu, penses à mettre résolu (idem pour tes autres topic). Cela permet d'indiquer à ceux qui font des recherches de savoir que le topic contient une solution :wink:

Eléphant du PHP | 122 Messages

09 oct. 2008, 09:59

Hello ...

Ce n'est pas encore résolu car maintenant il me reste à afficher dans mon menu les lignes actives pour les admin ou non ....

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

09 oct. 2008, 10:31

Modération :
Jackisback, si tu as une autre question ouvre un nouveau sujet,
cela te permettra d'avoir plus de réponses.

En plus, tu pourras mettre [Résolu] dès que ton problème évoqué ici sera réglé.

Merci de prendre le temps de lire les règlements.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.