Précédent   Forum des professionnels en informatique > PHP > Langage > Sessions
Sessions Forum d'entraide sur les sessions avec PHP. Avant de poster -> FAQ sessions, Cours sessions et Sources sécurité
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/01/2007, 10h21   #1
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Par défaut Comment utiliser session_start() dans un fichier inclus

Bonjour, après avoir passé pas mal de temps à lire les conseils et tuto sur le sujet, j'ai une question bien précise : est-il possible d'utiliser le script session_start() dans un fichier inclus via ma page index.php, de façon propre. Je m'explique. Mon site fonctionne trés bien, ma page d'identification + redirection avec ouverture de session charge la page concernée dans ma DIV dynamique. Et si j'enregistre cette page en favoris, quand je j'y reviens aprés fermeture du navigateur, ça me redirige vers ma page d'identification. Mais j'ai en + l'affichage du message d'erreur "Cannot modify header information - headers already sent by ...". Y a t-il moyen de vider la mémoire avant la redirection + session pour éviter ce message ? Merci d'avance.
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 11h42   #2
Candidat au titre de Membre du Club
 
Inscription : novembre 2006
Messages : 31
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 31
Points : 12
Points : 12
Citation:
Envoyé par nicolas2603
Bonjour, après avoir passé pas mal de temps à lire les conseils et tuto sur le sujet, j'ai une question bien précise : est-il possible d'utiliser le script session_start() dans un fichier inclus via ma page index.php, de façon propre. Je m'explique. Mon site fonctionne trés bien, ma page d'identification + redirection avec ouverture de session charge la page concernée dans ma DIV dynamique. Et si j'enregistre cette page en favoris, quand je j'y reviens aprés fermeture du navigateur, ça me redirige vers ma page d'identification. Mais j'ai en + l'affichage du message d'erreur "Cannot modify header information - headers already sent by ...". Y a t-il moyen de vider la mémoire avant la redirection + session pour éviter ce message ? Merci d'avance.
oui c'est tt à fait possible si tu n 'affiches rien ou n'envoies rien comme entêtes avant l'appele de session_start()!

Ton erreur de header vient de là.... Essaie de séparer opérations(login, récupération de variable sur les table, etc..) et affichage de contenu, ça t'évitera des problèmes

Exemple de programmation modulaire en PHP

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# tu traites les infos/opérations session dans un fichier spécifique (login par exemple)
include("session.php");
 
# tu inclus le header
include("header.php");
 
# si tu veux moduler par page alors tu utilises un argument en paramètre et tu inclus en fonction de la valeur
if(!empty($_GET['page'])
 include("pages/{$_GET[page]}.php");
else
 include("pages/accueil.php");
 
#tu inclus le footer
include("footer.php");
Ceci est un SIMPLE exemple de modularité à adpater selon tes besoins....J'espère avoir pu t'aider un peu

bblampain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2007, 11h53   #3
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Et ça je le fais sur quel fichier ? Pour l'instant la structure de site ressemble à ça (désolé je débute et j'apprends sur le tas, c'est pas évident) :

Mon fichier index.php est comme ça en gros :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<head></head>
<body>
<table width="830px" border="0" align="center"><tr><td>
<div id="global">
 
<div id="calque1" class="gauche">(menu fixe gauche)</div>
<div id="calque2" class="haut">(menu fixe haut)</div>
<div id="calque3" class="frame">
<?php
$pages=array(
'accueil'=>'accueil.htm',
'presentation'=>'presentation.htm',
'activites'=>'activites.htm',
'membre1'=>'zone_membre/membre1.php',
'membre2'=>'zone_membre/membre2.php',
'erreur'=>'zone_membre/erreur.php',
'session'=>'zone_membre/session.php'
);
if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages))
include $pages[$_GET['page']];
else
include 'accueil.htm';
?>
</div>
 
</div>
</td></tr></table>
</body>
</html>
Et dans la div "calque3" se chargent les pages, dont celles qui sont sécurisées (membre1.php, membre2.php), qui commencent comme ça :

Code :
1
2
3
4
5
<? session_start();
if(!isset($_SESSION['nom'])) {
include('session.php');
exit; } ?>
<div></div>
Et sont vérifiées par le script "login.php" entre index et membre 1, lequel est :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
...
<?
on se connecte à MySQL
on sélectionne la base
 
if(isset($_POST) && !empty($_POST['identifiant'])) {
  extract($_POST);
  // on recupère le password de la table qui correspond au login du visiteur
  $sql = "select nom, lien, passe from *** where nom='".$identifiant."'";
  $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
 
  $data = mysql_fetch_assoc($req);
 
  if($data['nom'] != $identifiant) {
  	$url_erreur="../index.php?page=erreur";
   	header("Location:$url_erreur");
	exit;
	}
 
  else {
    session_start();
    $_SESSION['nom'] = $identifiant; // si l'invité est bien logué
 
	$destination=mysql_result($req,$i,"lien");
	{
	header("Location:$destination"); // on le redirige vers la page correspondant à son identifiant
	}	
 
  }   
}
else {
  echo '<p>Vous avez oublié de remplir un champ.</p>';
   exit;
}
 
?>
Donc je modifie mon login.php ?
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 17h57   #4
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
J'ai du mal à comprendre pourquoi tu tiens absolument à mettre ton session_start() dans ton div.
Il faut, à mon avis, que tu déclare ta session au tout debut de ton script, et tu laisse le reste comme ça.

index.php

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php session_start(); ?>
<head></head>
<body>
<table width="830px" border="0" align="center"><tr><td>
<div id="global">
 
<div id="calque1" class="gauche">(menu fixe gauche)</div>
<div id="calque2" class="haut">(menu fixe haut)</div>
<div id="calque3" class="frame">
<?php
$pages=array(
'accueil'=>'accueil.htm',
'presentation'=>'presentation.htm',
'activites'=>'activites.htm',
'membre1'=>'zone_membre/membre1.php',
'membre2'=>'zone_membre/membre2.php',
'erreur'=>'zone_membre/erreur.php',
'session'=>'zone_membre/session.php'
);
if(isset($_GET['page']) && array_key_exists($_GET['page'],$pages))
include $pages[$_GET['page']];
else
include 'accueil.htm';
?>
</div>
 
</div>
</td></tr></table>
</body>
</html>
et ton div "calque3"

Code :
1
2
3
4
5
<? 
if(!isset($_SESSION['nom'])) {
include('session.php');
exit; } ?>
<div></div>
rappelle toi qu'il faut toujours démarrer ta session avant d'envoyer quoi que ce soit comme code html ou autre.
et ce n'est pas parce que tu demarre une session qu'il faut absolument s'en servir immediatement après l'avoir ouverte.

@++
p.legal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 09h48   #5
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90
Oui je comprends tout à fait ce que tu me dis, mais j'essaye de démarrer ma session dans la div car je fais le site d'un bureau d'étude qui travaille pour différentes communes. Le site en lui même doit etre accessible par tous, mais j'aimerai que la session démarre seulement en cliquant sur le lien "espace technique", où chaque commune entre son identifiant. Si je fais comme l'exemple que tu me donnes, où le session_start est au début de l'index, il faut je suppose s'identifier dès l'arrivée sur le site, et ce n'est pas ce que je cherche. Il faut qu'il soit accessible pour tous, et connecté à une session au démarrage de l'espace technique. Et c'est ça que je ne sais pas si c'est faisable !!!
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 09h53   #6
Membre régulier
 
Inscription : décembre 2006
Messages : 493
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 493
Points : 90
Points : 90

je viens de tester ce que tu m'as expliqué plus haut, mille excuses, apparemment ça a l'air de fonctionner nickel comme ça, il suffisait effectivement de mettre le session_start() au début de l'index, et ne pas mettre dans la page qui se charge. Merci beaucoup d'avoir enfin réussi à m'aider !!!
nicolas2603 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 09h55   #7
Membre chevronné
 
Avatar de J0r_x
 
Homme
Analyste - Programmeur
Inscription : mai 2006
Messages : 712
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Analyste - Programmeur
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2006
Messages : 712
Points : 607
Points : 607
Mets le des le debut et non dans ton div. session_start() "prépare" ta page à être utilisable pour les sessions, personne ne sera obligé de se connecter sur ton site parce que tu as mis session_start();

EDIT: too late
J0r_x est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2007, 16h00   #8
Membre régulier
 
Inscription : janvier 2007
Messages : 85
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 85
Points : 80
Points : 80
Ravi d'avoir pu t'aider !
pense à mettre résolu en éditant ton premier post.

@++
p.legal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h09.


 
 
 
 
Partenaires

Hébergement Web