Gestion de la touche ENTER et d'un INPUT sous IE et Firefox

zest
Invité n'ayant pas de compte PHPfrance

22 juin 2007, 23:08

Bonjour,
Je viens de créer un formulaire basique de LOGIN et PASSSWORD. La validation de ce formulaire entraine 3 possibilités:
- les identifiants n'existent pas la page index.php est affichée en mode "visiteur".
- les identifiants existent et sont ceux d'un membres, la page index.php est affichée en mode "membres".
- les identifiants existent et sont ceux de l'administrateur, a page index.php est affichée en mode "administrateur".
Les identifiants sont gérés par des variables de session-->$_SESSION["login"] et $_SESSION["password"] qui sont comparés à la base SECURE...
Jusque là, rien de bien extraordinaire. Mais voilà:
- sous FF et IE7 lorsque je me signe en ADMIN et que je clique sur la touche VALIDER, la page index.php remonte bien en mode "admin".
- sous FF et IE7 lorsque je me signe en ADMIN et que je clique sur la touche ENTER, la page index.php remonte bien en mode "admin".
dans les deux cas je suis donc signé en admin et la page est en admin...Tout va bien
Le problème c'est que lorsque je reclique sur VALIDER ou ENTER, avec des identifiants erronés ou des champs vident, la page index.php revient en mode "visiteur".
Si je rentre des identifiants de "membres" tout fonctionne, la page se met en mode "membres".
Voici les codes:

Code : Tout sélectionner

<form id="log" name="log" method="post" action="veriflogin.php"> <input type="text" name="login" value="Login" onFocus="this.value=''"/><br/> <input type="password" name="mot_de_passe" value="*****" onFocus="this.value=''"/><br/> <input type="submit" id="submit" name="submit" value="Valider !"/> </form>
et le fichier veriflogin.php
<?php
if($_POST["login"] != "" && $_POST["mot_de_passe"] != "")
{
  $login     = $_POST["login"] ;
  $password  = $_POST["mot_de_passe"] ;
  include('connect.php');
  $sql = "SELECT * FROM membres WHERE id AND login = '$login' AND password = '$password'";
  $requete = mysql_query($sql, $cnx) or die($sql."<br>".mysql_error()) ;
  $result = mysql_fetch_object($requete) ;
  if(is_object($result))
  {
    session_start() ;
    $_SESSION["login"] = $login ;
    $_SESSION["password"] = $password ;
    header("Location: index.php") ;
  }
  else
  {
    header("Location: index.php") ;
  }
}

{
  header("Location: index.php") ;
}
?>
et le code qui determine le mode de la page
<?php
if(!isset($_SESSION["login"]) || $_SESSION["login"] == "") 
{ 
	$varsess = 0;
	echo '&nbsp;Vous n êtes pas identifié&nbsp;!'; 
}elseif (($_SESSION["login"] == 'administrateur') && ($_SESSION["password"] == 'passadmin')) {
	$varsess = 2;
	echo '&nbsp;Bonjour Maître ';
	} else {
	$varsess = 1;
	echo '&nbsp;Bonjour '.ucfirst($_SESSION["login"]).'&nbsp;...';
}	
?>
je suis coincé, je ne vois pas ou ça "vrille"  :( 
Pourquoi les variables de sessions sont-elles effacées lors d'une seconde soumission ??
Merci pour vos réponses....

Mammouth du PHP | 19672 Messages

23 juin 2007, 00:51

mets ton session_start() en début de code, ça devrait résoudre le problème.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

zest
Invité n'ayant pas de compte PHPfrance

23 juin 2007, 01:36

Merci Cyrano..
Effectivement le fait de mettre session_start() en début de code resoud bien le problème...mais sous IE7 seulement !!
Sous Firefox la première signature est bien prise en compte. Mais ensuite impossible de se ressigner si par hazard une deconnexion de session a eu lieu. Ce qui est étrange c'est que si je me signe avec (par exemple) MOI et PASSMOI qui est une signature membre lors d'une première connexion, tout fonctionne parfaitement. Si je clique sur deconnexion (session) et que je re-saisie MOI et PASSMOI la page en mode "membres" ne remonte pas. Et si je clique sur le rafraichir de Firefox alors la signature remonte avec le mode de page concernée !!!
Etrange, Non ?
Sans doute un problème de gestion du cache ?
Si je suis en session "admin", impossible de passer en session "membres" !!!
Pour une fois que IE me comble de bonheur :shock:
Si quelqu'un a une solution... :idea:

Eléphanteau du PHP | 35 Messages

23 juin 2007, 01:43

Je viens de tester sous FF LINUX Ubuntu et c'est le même pb !!! :?:
Peu de gens sont dignes de ne croire à rien.

Mammouth du PHP | 19672 Messages

23 juin 2007, 09:44

Est-ce que tu supprimes bien les variables de session lors de la déconnexion.

Détail, en regardant ton code d'un peu plus près, j'ai relevé un point particulier : on ne stocke jamais un mot de passe dans une variable de session, ce n'est pas prudent du tout.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 35 Messages

23 juin 2007, 11:31

Voici mon code de deconnexion.
<?php
  session_start() ;
  session_unset() ;
  session_destroy() ;
  header("Pragma: no-cache") ;
  header("Cache-Control: no-store, no-cache, must-revalidate") ;
  header("location: index.php") ;
?>
Mais le cas se presente sous Firefox, même si on clique pas sur deconnexion.
Par exemple je suis menbre et admin. J'ai donc deux signatures. Si je suis déjà signé en "membres" et que je me signe en "admin", la page ne passe pas en mode "admin", sauf si je clique sur "raffraichir" dans la barre de navigation !!??
Je stocke le password dans une variable de session pour differencier l'identifiant de l'admin de celui des membres. Je ne savais pas que c'était deconseillé. Qu'est qu'il vaut mieux faire ?
Peu de gens sont dignes de ne croire à rien.

Mammouth du PHP | 19672 Messages

23 juin 2007, 12:28

Au moment de la connexion, crée plutôt une variable de session comme celle-ci:
$_SESSION['login'] = $pseudo;
$_SESSION['acces'] = $niveau;
Dans la première, tu mets le pseudo du membre. Dans la seconde, tu mets un niveau récupéré dans la base lors de l'identification, par exemple 1 pour un membre normal, 2 pour un modérateur, 3 pour un admin, 4 pour un super-admin et par défaut, 0 pour un visiteur non identifié. Au début de chaque page, tu vérifies simplement le niveau enregistré pour définir si tu dois ou non afficher cette page ou afficher un message d'alerte, voire, si le pseudo est vide, tu rediriges automatiquement vers la page d'identification par exemple.

Lorsque tu déconnectes, tu fais ceci :
$_SESSION['login'] = '';
$_SESSION['acces'] = 0;
Et là, plus de problème, chacun a son propre niveau d'accès. Si tu te connectes et que tu as le niveau d'administrateur, tu pourras visiter des pages que les membres de niveau inférieur ne pourront pas voir. Tu n'as nullement besoin du mot de passe en dehors de la phase d'identification, cette donnée doit rester le moins possible et n'être utilisée QUE pour l'identification.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 35 Messages

26 juin 2007, 14:22

Ok Cyrano et merci pour ton conseil...que j'ai suivi :)

Par contre j'ai encore quelques bizarreries...;
At home je bosse sous WinXP et Firefox et IE7, et au boulot sous Win2000, Firefox et IE6 (et oui je sais, ça craint)...Une chose qui m'intrigue c'est que la validation du formulaire d'identification par la touche ENTER ne fonctionne correctement que sur WinXp, FF, IE7 !!!
Sous Win2000, FF, IE6 la touche ENTER n'est pas prise en compte.
Pourtant il s'agit du même site (je ne travaille pas en local).

Si quelqu'un a un explication...
Peu de gens sont dignes de ne croire à rien.

Mammouth du PHP | 693 Messages

26 juin 2007, 15:23

C'est du aux différents navigateurs, c'est pas pour rien que IE6 est passé à IE7 :P

Invité
Invité n'ayant pas de compte PHPfrance

29 juin 2007, 10:54

OK Orgerix...j'avais bien compris qu'il y avais un problème du aux navigateurx.
Mais le problème est identique sur Firefox 2.0.0.4 + Win 2000, alors que sous Firefox2.0.0.4 et XP la touche ENTER fonctionne bien pour valider le formulaire de login !!
Donc est-ce bien le navigateur qui pose problème ?
Et quelle solution pour y remedier ?

ViPHP
ViPHP | 5924 Messages

29 juin 2007, 14:00

et au boulot sous Win2000, Firefox et IE6 (et oui je sais, ça craint)...
Sans vouloir troller, Windows 2000 Pro SP4 est un très bon système Windows, quasiment aussi bon que Windows XP Pro SP2, donc ca ne craint pas tant que ca...

Eléphanteau du PHP | 35 Messages

30 juin 2007, 09:00

Je ne disais pas ça pour Win2000pro....mais pour IE6 qui est une veritable verrue :?
Le problème c'est que IE6 représente encore entre 50% et 38% de part de marché s46fyselon les stats !!

http://www.w3counter.com/globalstats.php

http://www.w3schools.com/browsers/browsers_stats.asp

Quoiqu'il en soit, il me tarde que IE6 disparaisse. La difficulté pour IE7 à s'imposer relève plus du fait qu'il existe un nombre de copie pirate d'XP incroyable, que du fait qu'IE6 soit mieux que IE7.

Néanmoins le pb de validation par la touche ENTER semble relever de Win2000 pro SP4.
Peu de gens sont dignes de ne croire à rien.