session_start()

Eléphanteau du PHP | 17 Messages

10 oct. 2009, 23:04

Salut

Je souhaite créer une page de login pour un site de jeu avec les propriétés suivantes :

Si le joueur arrive sur la page, il a les champs de login / mdp affichés.
Si le joueur a entré ses identifiants, la page est rechargée et affiche la page d'accueil normale (ici "bienvenue machin").
Si le joueur a entré de mauvais identifiants, la page est rechargée et lui dit l'erreur.

Voici le code :
<?php

if ( !isset($_SESSION['login'])) // Si le login de la session n'existe pas
	{
	 
	 if ( isset ($_POST['login']) AND isset ($_POST['password'])) //La page est chargée avec les données de connexion
		{
		 $login = $_POST['login'] ;
		 $password = $_POST['password'] ;
		 
		 include_once('connexion.inc.php'); //connexion à la BDD
		
		 $sql = "SELECT id_joueur FROM joueur WHERE login='$login' AND password='$password'";
		 $recup = $dbh->query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()) ;
		 $result = $recup->fetchAll() ;
		 $nombre = count($result) ;
		 
		 if ( $nombre == 1) // Il y a bien un couple existant de ce login/mot de pass => on crée la session avec le login
			{
			 
			 $_SESSION['login'] = "$login"; 
			 header("Location: accueil2.php"); 
			 exit() ;
			}
		 elseif ( $nombre == 0) // Il n'y a aucune entrée correspondant
			{
			 echo "mauvais password ou mauvais login" ;
			}
		 else // Il y a plusieurs couples correspondant (pas normal !)
			{
			 echo "2 login similaires existent dans la base de donnée, veuillez en informer le webmaster" ;
			}
		
		}
	 else // La page est chargée sans données de connexion (1ere visite)
		{
		 echo "<html>";
		 echo "<head><title>accueil</title></head>";
		 echo "<body>";
		 echo "<form method='POST' action='accueil2.php'>
				<label for='nom'>Login : </label>
				<input type='text' name='login'>
				<label for='password'>password : </label>
				<input type='password' name='password'>
				<input type='submit' value='connecter'>
				&nbsp &nbsp &nbsp 
				<a href='inscription.php'>inscription</a>
			</form>" ;
		}
	 
	 
	}

else  //Là, on a bien la session avec le login, donc on lance la page normale
	{
	 $login = $_SESSION['login'] ;
	 echo "<html>";
	 echo "<head><title>accueil</title></head>";
	 echo "<body>";
	 echo "bienvenue $login !" ;
	 }

echo "</body></html>" ;
?>
Vous l'avez vu, il n'y a pas de session_start().

En réalité, je voudrais le mettre ici :
if ( $nombre == 1) // Il y a bien un couple existant de ce login/mot de pass => on crée la session avec le login
			{
			 session_start() ;
			 $_SESSION['login'] = "$login"; 
			 header("Location: accueil2.php"); 
			 exit() ;
			}
Mais ca ne fonctionne pas.
En revanche, si je le place au tout début de ma page, cela fonctionne. Ce que je ne comprends pas, c'est qu'il me semble que ce qui concerne les sessions doit être créé avant la page html, or il me semble que c'est pourtant le cas dans ma page. Peut être ai-je mal compris ?

Eléphant du PHP | 369 Messages

11 oct. 2009, 09:29

Salut,
Salut
Je souhaite créer une page de login pour un site de jeu avec les propriétés suivantes :
Si le joueur arrive sur la page, il a les champs de login / mdp affichés.
Si le joueur a entré ses identifiants, la page est rechargée et affiche la page d'accueil normale (ici "bienvenue machin").
Si le joueur a entré de mauvais identifiants, la page est rechargée et lui dit l'erreur.
Voici le code :
[...]
Vous l'avez vu, il n'y a pas de session_start().
En réalité, je voudrais le mettre ici :
[...]
Mais ca ne fonctionne pas.
En revanche, si je le place au tout début de ma page, cela fonctionne. Ce que je ne comprends pas, c'est qu'il me semble que ce qui concerne les sessions doit être créé avant la page html, or il me semble que c'est pourtant le cas dans ma page. Peut être ai-je mal compris ?
Tout ce qui est header et init session c'est: Au début des pages... Ou faut biaiser. Rien ne doit
avoir été envoyé au serveur avant ca. Autrement dit il est normal que ton exemple ne fonctionne pas.

Sieur AB a écrit un tuto dans ce domaine. Lien: faq-tutoriels/inscription-connexion-dan ... 42539.html
il s'inscrit, si je ne m'abuse, dans le cadre de ce que tu veux faire. Facile à comprendre, facile à mettre en place.
A toi de t'en inspirer.

@+ bonne lecture ;)

PS: En ayant lu un peu ton scripts j'ai 2 remarques. Ta comparaison en php du ET logique devrait être &.
La recherche en DB de ton login et passwd indique qu'il sont dans la même table, tu devrais les mettre
dans deux différentes et (tant qu'on y est) encoder le passwd en MD5 (c'est juste un conseil, tu fais ce
que tu veux).

Eléphanteau du PHP | 17 Messages

11 oct. 2009, 09:46

merci, j'vais aller voir ca. Pour le code du pass en md5, c'est prévu, pour l'instant je testais juste les sessions. Mais pourquoi les mettre dans 2 tables différentes ? Question de sécurité ?

Eléphant du PHP | 369 Messages

11 oct. 2009, 10:09

Re,
merci, j'vais aller voir ca. Pour le code du pass en md5, c'est prévu, pour l'instant je testais juste les sessions. Mais pourquoi les mettre dans 2 tables différentes ? Question de sécurité ?
Yep, ca évite d'avoir tout dans le même tiroir... Ceci dit, c'est pas une obligation, c'est juste ce qui
devrait être (de mon point de vue).

@+ vais boire mon café ;)

Eléphanteau du PHP | 17 Messages

11 oct. 2009, 10:36

Bon bon bon, j'ai regardé, en fait il fait comme moi (ou bien je fais comme lui ^^)
if (isset($resultat['pseudo'],$resultat['pass']))  
               {
                 /* Démarre la session et enregistre le pseudo dans la variable de session $_SESSION['login']
                 qui donne au visiteur la possibilité de visiter les pages protégées.  */
                 session_start();
                 $_SESSION['login'] = $pseudo;
           
                 // A MODIFIER Remplacer le '#' par l'adresse de votre page de destination, sinon ce lien indique la page actuelle.
                 $message = 'Bonjour '.htmlspecialchars($_SESSION['login']).' <a href = "#">Cliquez ici pour vous connecter</a>';
                }
Il fait bien démarrer sa session au milieu de son code. Je ne vois pas trop la différence avec moi. Reste que j'arrive à faire fonctionner ma page comme je le veux (après avoir tout recommencé et mis session_start() en tout début), donc ca ne pose pas trop de problème, mais ça m'intrigue.

Si personne n'a répondu d'ici quelques heures, je mettrai ce topic comme résolu, vu que j'ai quand même réussi ce que je voulais.

Eléphant du PHP | 369 Messages

11 oct. 2009, 10:59

Re,
Bon bon bon, j'ai regardé, en fait il fait comme moi (ou bien je fais comme lui ^^)
[...]
Il fait bien démarrer sa session au milieu de son code. Je ne vois pas trop la différence avec moi. Reste que j'arrive à faire fonctionner ma page comme je le veux (après avoir tout recommencé et mis session_start() en tout début), donc ca ne pose pas trop de problème, mais ça m'intrigue.
Si personne n'a répondu d'ici quelques heures, je mettrai ce topic comme résolu, vu que j'ai quand même réussi ce que je voulais.
Ca ne t'aidra pas dans ton projet mais te fera comprendre pourquoi l'init de session ne peut
être placé comme tu veux, ou tu veux. Ecris ceci en haut de ta page:
error_reporting(E_ALL | E_STRICT);
@+ ;)

Eléphanteau du PHP | 17 Messages

11 oct. 2009, 11:14

merci beaucoup !