Session perdue ? / variable inconnue ? [RESOLU]

Eléphant du PHP | 93 Messages

06 oct. 2005, 03:52

Je suis vraiment désolé de vous déranger. :oops:

J'ai d'abord recherché ( depuis deux jours, mais il y a tellement de sujets ici ) si vous n'aviez pas répondu à une question ressemblant à la mienne, mais je n'ai pas trouvé.

Donc, je vous parle de mon problème. :?


Je veux établir un système de sessions pour un jeu de rôle en cours d'écriture.


:arrow: J'ai entré le nom de mon perso et son pass dans un tableau de la base de données.
:arrow: J'ai une page d'accueil avec un formulaire pour se loguer.
:arrow: J'ai une page login.PHP, qui gère le formulaire et crée la session.
Cette page login.PHP dirige le joueur vers son bureau personnel.( bureau.PHP )

Là, aucun problème, je peux récupérer par PHP, le login du connecté.
La session est donc ouverte.
Je récupère les infos concernant le perso ( avec l'aide du login ) dans une BDD, la même que celle où on a le pass et le login du perso au départ.
Tout va bien.
MAIS lorsque le joueur va cliquer sur les liens qui l'amènent soit vers le classement des joueurs, soit vers la gestion de location des terres, la session est perdue.

J'ai le message d'erreur suivant :

Notice: Undefined variable: login in c:\hochelagajpem\location.php on line 59

Donc, si je comprends bien, la variable concernant le login n'a pas suivi.

Est-ce que cela signifie que la session a été interrompue ?
Est-ce que cela signifie que la session existe toujours mais que je n'ai pas su faire suivre la variable du login ?
Ou la récupérer proprement ?


Y a-t-il une solution ?

Je vais vous copier ci-dessous les différents scripts que j'utilise, si cela peut aider à la résolution du problème.

SCRIPT de la page login.PHP :
<?
// ouverture de connexion vers mysql
mysql_connect("localhost", "root", ""); // Connexion à MySQL 
mysql_select_db("colons"); // Sélection de la base colons


if(isset($_POST) && !empty($_POST['login']) && !empty($_POST['pass'])) {
extract($_POST);
// on recupère le password de la table qui correspond au login du visiteur
$sql = "select pass from informations where login='".$login."'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$data = mysql_fetch_assoc($req);

if($data['pass'] != $pass) {
echo '<br/><p>Iroquois ? Anglais ? Qui êtes-vous ? <br/>
Vous ne pouvez pas entrer dans Hochelaga !</p><br/>';
include('inscription.PHP'); // On met le formulaire d'identification
exit;
}
else {
session_start();
$_SESSION['login'] = 'login';


echo ' ';
include('bureau.PHP');
// ici j'ai affiché un lien pour renvoyer
// vers la page d'accueil de mon espace membres 
} 
}

else {
echo '<p>Vous avez oublié de remplir un champ.</p>';
include('inscription.PHP'); // On met le formulaire d'identification
exit;
}

?>
En haut de la page classement.PHP, j'ai testé les deux solution ci-dessous :

1-
<?
session_start();
?> 


2-
<?
session_start();
/* 
si la variable de session login n'existe pas cela siginifie que le visiteur 
n'a pas de session ouverte, il n'est donc pas logué ni autorisé à
acceder à l'espace membres
*/
if(!isset($_SESSION['login'])) {
  echo 'Vous n\'êtes pas autoriser à acceder à cette zone';
  include('hochelaga.PHP');
  exit;
}
?>  
( PS : avec ce second session_start, qui inclue un retour à la page hochelaga.PHP, si ce n'est pas logué, if(!isset($_SESSION['login'], j'aurais normalement dû avoir un retour à la page d'accueil donc.
Le fait que la page s'ouvre, mais que la variable 'login' ne soit pas reconnue, impliquerait-elle que la session est bien toujours en cours, mais que j'ai plutôt un problème de variable ?
Et alors, pourquoi lorsque je veux retourner sur le bureau, j'ai la page perdue, comme si la session est effectivement perdue alors ? )


Je précise que je n'ai AUCUNE mention de session_start sur la première page qui accueille le membre.
Car elle fonctionne apparemment sans.
ET si je mets un session_start dessus, voilà le message d'erreur que j'obtiens en haut de la page :
Notice: A session had already been started - ignoring session_start() in c:\hochelagajpem\bureau.PHP on line 2
( comme si je tentais d'ouvrir une session alors qu'une est déjà ouverte ??? )


Bref, beaucoup de questions, je sais... :oops:

Mais je suis un vrai débutant en PHP, et je cherche, je cherche... :?
Modifié en dernier par ItaloBADI le 07 oct. 2005, 01:52, modifié 1 fois.

Eléphant du PHP | 93 Messages

06 oct. 2005, 04:04

Ah....
Une nouvelle intéressante...

J'ai utilisé ceci dans la page classement, soit celle où je pense avoir perdu ma session en cours...
<?php
// initialisation
session_start() ;

// tester la présence de la variable 'langage' dans la session
if ( isset( $_SESSION['login'] ) ) {
   
  echo 'login existe dans la session et sa valeur est ' ;
  // lecture de la variable de session 'langage'
  echo $_SESSION['login'] ;
} else {

  echo 'login n\'existe pas dans la session' ;
} 
?>
Je vérifie donc si la variable login existe dans la session, donc si la session et la variable ont bien été transmises avec la page, non ?

Bref, voilà la réponse :
login existe dans la session et sa valeur est login
Donc, c'est troublant.
Il semble que la session ne soit pas perdue, ni la variable, mais j'ai toujours la mention :
Notice: Undefined variable: login in c:\hochelagajpem\classement.php on line 43
Bonjour

Mammouth du PHP | 19672 Messages

06 oct. 2005, 08:42

Salut,
bon, c'est un peu fouillis tout ça, mais on va résumer. Je dirais que tu dois mettre en place la session indépendament du fait que le visiteur soit identifié ou non. Donc, à priori, tu dois mettre le session_start() au début de chacune des pages, ou plus précisément dans le premier fichier de chaque page si ces pages sont des cnonstructions composites de plusieurs fichiers. Ce que je veux dire par là, c'est que si une page est constituée par plusieurs fichiers, par exemple entete.php, contenu.php et pieddepage.php, tu ne dois mettre le session_start() qu'en début de entete.php, et ce pour toutes les pages du site.

Une fois que c'est fait, tu ne devrais plus avoir à te soucier d'autre chose que des variables de session. Donc ta variable $_SESSION['login'] sera soit inexistante soit existante et dans ce cas soit valuée soit vide. La session n'est qu'un contenant. Si une des page est chargée sans que le session_start() ne soit exécuté au début, le contenant (la session) est perdu.

Vérifie donc le déroulement de ta navigation pour voir où il y a un trou dans le suivi de session.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 357 Messages

06 oct. 2005, 10:50

Je pense qu'il y a eu un post avec à peu pres les memes problèmes (il me semble)
Et que la soluion pour lui était de pas mettre d'include mais des header.

Je pencherai personnellement fortement pour la solution de Cyrano mais les headers peuvent etre une alternative :oops:

Eléphant du PHP | 93 Messages

06 oct. 2005, 16:48

Je vous remercie.
Je vais voir cela et je vous tiens au courant. :wink:



Je me suis aussi demandé si le problème ne venait pas de includecomme tu le dis toi-même.
Et que la soluion pour lui était de pas mettre d'include mais des header.
Je remplace include par header et j'obtiens ce message d'erreur :

Warning: Cannot modify header information - headers already sent by (output started at c:\hochelagajpem\login.php:26) in c:\hochelagajpem\login.php on line 27

Eléphant du PHP | 93 Messages

07 oct. 2005, 01:03

Voilà ce qu'on m'a dit :
Il me semble que ce code :
session_start();
$_SESSION['login'] = 'login';

devrais etre :

session_start();
$_SESSION['login'] = $login;

Sinon ca voudrais dire que tu cree la session sous le login de LOGIN a chaque fois, qu'elle que soit la personne qui se connecte, son login serais LOGIN.

Bon sinon pour en finir avec cette erreur de variable de session, cree une page test.php, et fait lui un lien sur le bureau.
Dans cette page, met JUSTE ça :

<?php
session_start();
if(!isset($_SESSION['login'])) {
echo 'pas de variable session LOGIN...';
} else echo 'Ok ca marche !';

print_r($_SESSION); // va afficher l'ensemble des variables de session
?>
J'ai suivi les indications.
Ainsi, je n'ai plus LOGIN, pour tous, mais bien le login du perso-même.

Après, j'ai fait la page test et j'ai mis un lien sur le bureau :
ça a donné évidemment : Ok ca marche !Array ( [login] => MJ TAKKIK )

Or, j'avais testé sur la page classement la variable :

Résultat, avant, j'avais login existe dans la session et sa valeur est MJ TAKKIK

Donc la session passe bien de la page du bureau aux autres pages-liens.

MON PROBLEME est que les variables ne passent pas.

Ainsi, même si j'ai login existe dans la session et sa valeur est MJ TAKKIK, en dessous, pour la phrase PHP
<? echo "Bonjour $login"; ?>
qui sur l ebureau donne bien ceci :
Bonjour MJ TAKKIK

et bien, sur le classement, j'ai ce message d'erreur :
Notice: Undefined variable: login in c:\hochelagajpem\classement.php on line 43
Bonjour


Conclusion :

la session passe bien, elle existe.
le login est reconnu, il existe.
MAIS entre le bureau et le classement, la variable $login qui est bien reconnue, comme étant celle du login connecté, ne fonctionne pas semble-t-il...
Et pourtant, j'utilise le même code que pour la page du bureau où elle fonctionne.
Je n'y comprends rien.
Je cherche, je cherche, lol...

Que faire ?
Où pourrait être l'erreur ?

Eléphant du PHP | 93 Messages

07 oct. 2005, 01:54

MERCI A CEUX QUI ONT PRIS LE TEMPS DE ME CONSEILLER !
Grâce à chacun d'entre vous, et à mon ami mobman également, peu à peu, on y arrive !


BON, j'ai TROUVE !!!

Génial ! Cool ! Super !

Bon, je vais vous dire comment j'y arrive, mais j'ai l'impression que c'est le plus grand des désordres, faudra que j'améliore mon style je crois !
Enfin, pour le moment, ça fonctionne... :P

La session était bien existante, la variable suivait bien, mais je n'arrivais pas à la retrouver en fait...
Et ensuite, il y avait le problème du retour sur le bureau du perso, et là aussi, j'ai trouvé...

Le noeud du problème était d'une part dans la manière dont j'appelais ma variable, je mettais echo bonjour $login.

A la place, j'ai mis :
Bonjour <? echo $_SESSION['login'] . ' '; ?>
Et de la même manière, pour aller chercher les données concernant le perso logué dans la BDD, je mettais à la fin de la commande : WHERE login = $login, ce qui fonctionnait, mais uniquement dans le bureau, pas après, où la variable était perdue.
J'ai donc terminé ma ligne ainsi :
where login = '".$_SESSION['login']."'";

ça fait un peu bizarre tous ces ' et ces ", mais sinon, cela ne fonctionnait pas...

ensuite, j'avais donc le problème du retour sur le bureau.
Là, soit je mettais en tête de ma page bureau.PHP un session_start() mais alors, j'avais un problème lors de la première connexion, car ma page de login.PHP envoyait directement sur le bureau après avoir ouvert une session déjà...
Ce qui faisait une redondance avec le session_start() à la première connexion, avec donc un petit message d'erreur tout en haut ( mais tout fonctionnant ) et surtout, la possibilité de revenir après avoir quitté la page, en gardant la session ouverte.

La solution ?
J'ai été obligé de ne pas mettre un include pour le bureau dans la page pour se loguer, j'ai mis à la place un message de bienvenue avec un lien vers le bureau, et ainsi, je peux mettre un session_start() en haut du bureau.

Mon problème est que cette page où on donne le lien est toute blancxhe, pas très jolie, je vais voir ce que je peux faire...

Mais bon, en attendant, je peux travailler avec mes variables qui sont transmises de page en page.