Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1869 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  changement aspect bouton menu

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

changement aspect bouton menu

n°2024704
t671
Posté le 23-09-2010 à 14:48:31  profilanswer
 

Bonjour,
 
J'ai un site qui affiche des bouton pour le menu.
Quand j'affiche une page, je souhaiterais que le bouton du menu correspondant prenne un autre aspect parrapport aux autres boutons.
Si je défini les boutons et les pages en php dans un tableau, ça fonctionne :
 

Code :
  1. <?php
  2. $pages = array(
  3. 'accueil'=>'accueil.htm',
  4. 'humanitaire'=>'humanitaire.htm',..............);
  5. if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages)){
  6. $inc = $pages[$_GET['page']];
  7. $active = $_GET['page'];
  8. }
  9. else{
  10. $inc = 'accueil.htm';
  11. $active = 'accueil';
  12. }
  13. echo '<div class="menu"><ul>
  14. <a class="bouton'.($active == 'accueil' ? 'active' : '').'" href="index.php?page=accueil.htm">Accueil</a><p>
  15. <a class="bouton'.($active == 'humanitaire' ? 'active' : '').'" href="index.php?page=humanitaire">L\'action humanitaire</a><p>...........
  16. echo '<div class="frame">';
  17. include($inc);
  18. echo '</div>';
  19. ?>


 
Mais si les les boutons et les pages sont issuent d'une base de donnée, j'y arrive pas  :(  :
 

Code :
  1. $select = 'SELECT * FROM menu ORDER BY id ASC';
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  3. echo '<div class="menu">';
  4. while($row = mysql_fetch_array($result))
  5. {
  6. echo '<a class="bouton'.($active == '.$row[\'nom\'].' ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  7. }
  8. echo '</div>';
  9. if(isset($_GET['lien']))
  10. {
  11. $inc = $_GET['lien'];
  12. $active = $_GET['nom'];
  13. }
  14. else
  15. {
  16. $inc = 'accueil.htm';
  17. $active = 'accueil';
  18. }
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
Merci d'avance pour l'aide que vous pourriez mapporter.

mood
Publicité
Posté le 23-09-2010 à 14:48:31  profilanswer
 

n°2024709
czh
Posté le 23-09-2010 à 15:09:09  profilanswer
 

t671 a écrit :


Code :
  1. $select = 'SELECT * FROM menu ORDER BY id ASC';
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  3. echo '<div class="menu">';
  4. while($row = mysql_fetch_array($result))
  5. {
  6. echo '<a class="bouton'.($active == '.$row[\'nom\'].' ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  7. }
  8. echo '</div>';
  9. if(isset($_GET['lien']))
  10. {
  11. $inc = $_GET['lien'];
  12. $active = $_GET['nom'];
  13. }
  14. else
  15. {
  16. $inc = 'accueil.htm';
  17. $active = 'accueil';
  18. }
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
Merci d'avance pour l'aide que vous pourriez mapporter.


 
remplacer '.$row[\'nom\'].' par $row['nom'] ?

n°2024736
t671
Posté le 23-09-2010 à 16:34:21  profilanswer
 

czh a écrit :


 
remplacer '.$row[\'nom\'].' par $row['nom'] ?


 
Ca change rien ! J'ai essayé $row['nom'] et '$row['nom']', mais ça fonctionne pas !
 
J'ai l'impression que le $active n'est pas lu ????  :heink:

n°2024740
czh
Posté le 23-09-2010 à 16:37:48  profilanswer
 

A moins qu'il n'y ait d'autre surprise ailleurs/avant la ligne entière correcte est :
 
echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
 
Sinon tu peux diagnostiquer le problème à l'aide de :
 
echo $active;
echo $row['nom'];
var_dump($active == $row['nom']);
var_dump($active == $row['nom'] ? 'active' : '');
 
Edit: par exemple initialiser $active ($active = $_GET['nom']; / $active = 'accueil'; ) avant de l'utiliser.
 

Code :
  1. if(isset($_GET['lien']))
  2. {
  3. $inc = $_GET['lien'];
  4. $active = $_GET['nom'];
  5. }
  6. else
  7. {
  8. $inc = 'accueil.htm';
  9. $active = 'accueil';
  10. }
  11. $select = 'SELECT * FROM menu ORDER BY id ASC';
  12. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() );
  13. echo '<div class="menu">';
  14. while($row = mysql_fetch_array($result))
  15. {
  16. echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  17. }
  18. echo '</div>';
  19. echo '<div class="frame">';
  20. include($inc);
  21. echo '</div>';


 
ps: include($inc); c'est plutôt dangereux


Message édité par czh le 23-09-2010 à 16:50:55
n°2024773
t671
Posté le 23-09-2010 à 17:52:53  profilanswer
 

Voici donc pour résumer :
 

Code :
  1. $select = 'SELECT * FROM menu'; 
  2. $result = mysql_query($select,$link) or die ('Erreur : '.mysql_error() ); 
  3.  
  4. echo '<div class="menu">';
  5. if(isset($_GET['lien']))
  6. {
  7. $inc = $_GET['lien'];
  8. $active = $_GET['nom'];
  9. }
  10. else
  11. {
  12. $inc = 'accueil.htm';
  13. $active = 'accueil';
  14. }
  15.   while($row = mysql_fetch_array($result))
  16. {
  17.   echo '<a class="bouton'.($active == $row['nom'] ? 'active' : '').'" href="menu.php?lien='.$row['lien'].'">'.$row['nom'].'</a><p>';
  18. }
  19. echo $active;
  20. echo $row['nom'];
  21. var_dump($active == $row['nom']);
  22. var_dump($active == $row['nom'] ? 'active' : '');
  23. echo '</div>';
  24. echo '<div class="frame">';
  25. include($inc);
  26. echo '</div>';


 
1) Qand j'ouvre le site, j'affiche donc la page "accueil", et l'onglet prend son aspect différent (donc ok). Cela est dû au  $inc = 'accueil.htm';
 $active = 'accueil';

Et les deux var_dump me donnent : accueilbool(false) et string(0) ""
2) Quand je clique ensuite sur un onglet, les deux "echo" (echo $active; et echo $row['nom'];) avant les var_dump ne donnent aucun résultat.
Et les var_dump donnent : bool(true) string(6) et "active".
 
D'après ce que j'en conclue, les variables $row['nom'] et $active sont vident (hormis pour la page initiale).
Pourtant, $row['nom'] s'affiche correctement dans l'onglet du menu !  :pt1cable:  
 
Qu'en penses-tu ? Quel est le remède à tout cela ?  :??:  
POur l'include, on verra après .....
 
Merci pour ton aide !

n°2024820
the_bigboo
Posté le 23-09-2010 à 23:01:46  profilanswer
 

C'est simple : quand tu écris tes balises <a> tu fais des liens du type :

echo "index.php?lien=".$LIEN


Ton menu est donc envoyé dans la variable $_GET["lien"];
Cette variable est récupérée en haut de ton script ligne 8, dans la variable $inc

 

Ton problème, c'est que dans ta boucle, tu ne teste pas $inc, mais $active !
C'est pour ça que ta condition de style ne marche pas.

Message cité 1 fois
Message édité par the_bigboo le 23-09-2010 à 23:02:39
n°2024951
t671
Posté le 24-09-2010 à 17:18:35  profilanswer
 

the_bigboo a écrit :

C'est simple : quand tu écris tes balises <a> tu fais des liens du type :

echo "index.php?lien=".$LIEN


Ton menu est donc envoyé dans la variable $_GET["lien"];
Cette variable est récupérée en haut de ton script ligne 8, dans la variable $inc
 
Ton problème, c'est que dans ta boucle, tu ne teste pas $inc, mais $active !
C'est pour ça que ta condition de style ne marche pas.


 
Là, je comprends pas trop ...... !?  :pt1cable:  

n°2025024
the_bigboo
Posté le 25-09-2010 à 10:18:44  profilanswer
 

Pour faire simple dans ton code, remplace à la ligne 19, $active, par $inc, et tu verras que ca va marcher.

n°2025045
Dj YeLL
$question = $to_be || !$to_be;
Posté le 25-09-2010 à 14:10:26  profilanswer
 

Code :
  1. if(isset($_GET['lien']))
  2. {
  3. $inc = $_GET['lien'];
  4. $active = $_GET['nom'];
  5. }


 
Bonjour le trou de sécu.


---------------
Gamertag: CoteBlack YeLL
n°2025072
t671
Posté le 25-09-2010 à 17:09:38  profilanswer
 

the_bigboo a écrit :

Pour faire simple dans ton code, remplace à la ligne 19, $active, par $inc, et tu verras que ca va marcher.


 
Ben non, ça fonctionne pas mieux !!!!!
Si tu regardes mon premier post, j'ai réussi à le faire en définissant le contenu du menu dans le script. Et ça foinctionne ......... !!!!!
Mais là, en définissant le menu dans une base de donnée, y'a pas moyen .......  :fou:

mood
Publicité
Posté le 25-09-2010 à 17:09:38  profilanswer
 

n°2025997
t671
Posté le 29-09-2010 à 18:29:14  profilanswer
 

Bonjour à tous,
 
Au sujet de mon include($inc); , comment l'écrire pour éviter le "trou de sécurité" ?
 
Merci !


Message édité par t671 le 29-09-2010 à 18:29:40
n°2027498
the_bigboo
Posté le 07-10-2010 à 11:27:57  profilanswer
 

Il ne faut pas faire d'include à partir d'une variable passée dans une globale.

n°2027509
Dj YeLL
$question = $to_be || !$to_be;
Posté le 07-10-2010 à 11:42:24  profilanswer
 

La règle n° en sécurité et de ne JAMAIS avoir confiance en l'utilisateur.


---------------
Gamertag: CoteBlack YeLL
n°2027510
t671
Posté le 07-10-2010 à 11:42:53  profilanswer
 

the_bigboo a écrit :

Il ne faut pas faire d'include à partir d'une variable passée dans une globale.


 
heuuuuuuuuuuu .... oui .......  :pt1cable: , et encore ......
 
Comment rectifier l'existant ??

n°2027523
the_bigboo
Posté le 07-10-2010 à 12:20:31  profilanswer
 

A la limite même si c'est pas tip top, au moins tu peux faire :

Code :
  1. $lien = $_GET["lien"];
  2. switch ($lien){
  3.   case "valeur1":
  4.     $inc = "valeur1.php" ;
  5.   break ;
  6.   case "valeur2":
  7.     $inc = "valeur2.php" ;
  8.   break ;
  9.   case "valeur3":
  10.     $inc = "valeur3.php" ;
  11.   break ;
  12.   case "valeur4":
  13.     $inc = "valeur4.php" ;
  14.   break ;
  15.   default :
  16.     // Lien invalide
  17.   break ;
  18. }
  19. if (isset($inc)){
  20.   include($inc);
  21. }


L'idée, c'est que si je peux bidouiller ton url, je pourrais par exemple faire un truc du genre :

index.php.lien=/etc/passwd


Bon j'ose espérer que les serveurs de nos jours sont protégés contre ce genre d'injection... Mais si ce n'était pas le cas, je verrais des fichiers systèmes qui pourraient potentiellement me permettre d'accéder à ton serveur...

n°2027524
Paulp
~, sweet ~
Posté le 07-10-2010 à 12:22:37  profilanswer
 

Un première sécurité peut être :

Code :
  1. $pages_autorisees = array(
  2.     'accueil',
  3.     'non_autorise',
  4.     'page1',
  5.     'page2',
  6.     'page3'
  7. );
  8. $inc = 'accueil';
  9. if(isset($_GET['lien'])){
  10.     if(in_array($_GET['lien'],$pages_autorisees)){
  11.          $inc = $_GET['lien'];
  12.     }else{
  13.          $inc = 'non_autorise'
  14.     }
  15. }
  16. include($inc . '.php');


EDIT : grillé


Message édité par Paulp le 07-10-2010 à 12:23:26
n°2027564
t671
Posté le 07-10-2010 à 14:26:22  profilanswer
 

Ok et merci pour les propositions !  
 
Mais je ne peux pas définir les valeurs de $inc en faisant
$lien = $_GET["lien"];
switch ($lien){
  case "valeur1":
    $inc = "valeur1.php" ;
  break ;
  case "valeur2":
    $inc = "valeur2.php"...............

 
ou de $pages en faisant
1.$pages_autorisees = array(
   'accueil',
   'non_autorise',...............

 
Car les valeurs des pages à afficher sont dans une bd, et peuvent évoluer sans faire évoluer le script d'affichage du menu .

n°2027628
the_bigboo
Posté le 07-10-2010 à 15:35:51  profilanswer
 

A toi d'adapter pour que les propositions qu'on t'a faite soient adaptées sur un modèle :
 
Tu récupères tes valeurs depuis la BDD, et tu construis ta liste de liens autorisés sur le modèle que t'a fourni PaulP ;)

n°2027635
Paulp
~, sweet ~
Posté le 07-10-2010 à 15:41:32  profilanswer
 

La grande question est :
que se passe-t-il si on appelle index.php?lien=/etc/passwd ou index.php?lien=';DELETE FROM users;

n°2027641
the_bigboo
Posté le 07-10-2010 à 15:55:39  profilanswer
 

De ce que je vois il ne fait pas de requête SQL prenant des globales en compte. Niveau injection, ça a l'air bon.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  changement aspect bouton menu

 

Sujets relatifs
HTML/CSS: Problème - menu avec des imagesAjax - Changement contenu cellule
Rendre visible/invisible un sous menu en CSS ?Dégriser un bouton au clique sur un autre boutton
Récupérer la valeur d'un bouton radio en JSMenu CSS sans javascript
Création bouton dynamique[VB.net] Reload, refresh form après changement de la langue
changer aspect curseur vbscriptCKEDITOR ajouter bouton
Plus de sujets relatifs à : changement aspect bouton menu


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR