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 29/06/2006, 16h56   #1
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Par défaut [Cookies] Problème avec session_start

Bonjour.
Ca va être un peu long mais je préfère tout donner maintenant.
Sur ma page index.php j'ai un bouton qui affiche une page pour s'enregistrer dont voici une partie du code
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
37
38
<!-- Menu  -->
<dl id="menu">
	<dt><a href="index.php?page=accueil"><img src="images/menu/accueil.GIF" border="0" onMouseover="this.src='images/menu/accueilh.GIF'"; onMouseout="this.src='images/menu/accueil.GIF'"></a></dt>
	<dt><a href="index.php?page=abo"><img src="images/menu/abonnement.GIF" border="0" onMouseover="this.src='images/menu/abonnementh.GIF'"; onMouseout="this.src='images/menu/abonnement.GIF'"></a></dt>
	<dt onmouseover="javascript:montre('smenu1');" onmouseout="javascript:montre();"><img src="images/menu/archives.GIF" border="0" onMouseover="this.src='images/menu/archivesh.GIF'"; onMouseout="this.src='images/menu/archives.GIF'"></a></dt>
		<dd id="smenu1" onmouseover="javascript:montre('smenu1');" onmouseout="javascript:montre();">
			<ul>
				<li><a href="index.php?page=2005">&nbsp;&nbsp;2005</a></li>
			</ul>
		</dd>
	<dt onmouseover="javascript:montre('smenu4');" onmouseout="javascript:montre();"><a href="#">&nbsp;Réseaux</a></dt>
	<dt onmouseover="javascript:montre('');" onmouseout="javascript:montre();"><a href="index.php?page=reseaux1">&nbsp;Réseaux (payant)</a></dt>
</dl>
</div>
<div class="frame"> 
<?php 
if (!isset($_GET['page'])) $page= 'accueil'; else $page= $_GET['page'];  
 switch($page)
{
//menu horizontal
case 'accueil': include ('accueil.php');break;
case 'contacts': include ('contacts.php');break;
 
//menu vertical
case 'abo': include ('membres/membre_nouveau.php');break;
case 'inscriptions': include ('inscription.php');break;
case 'reseaux1': include ('reseaux_1.php');break;
case 'reseaux': include ('reseaux.php');break;
 
case 'insc': include ('membres/membre_nouveau.php');break;
case 'enreg_nouveau': include ('membres/enreg_nouveau.php');break;
 
//liens page d'accueil
case 'fr2s6': include ('revues/fr2s6.php');break;
case 'fr2s5': include ('revues/fr2s5.php');break;
case 'fr2s4': include ('revues/fr2s4.php');break;
} 
?>
Dans un sous-répertoire "membres" j'ai :
-un fichier fns_affichage.php qui contient un formulaire.
-un fichier enreg_nouveau.php qui contient le code suivant
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
37
38
39
40
41
42
<?php
  require('connect.php');
  // include function files for this application
  require_once('fns_reseaux.php');
  //creation des variables aux noms abrégés
  $surname=$_POST['surname']; 
  $name=$_POST['name']; 
  $adresse=$_POST['adresse'];
  $codep=$_POST['codep'];
  $ville=$_POST['ville'];
  $username=$_POST['username'];
  $email=$_POST['email'];
  $passwd=$_POST['passwd'];
  $passwd2=$_POST['passwd2'];
  $revue=$_POST['revue'];
  $revue1=$_POST['revue1'];
  $lci=$_POST['lci'];
  $li=$_POST['li'];
  $reseaux=$_POST['reseaux'];
//enregistrement d'un nouveau membre
    //référence d'acces
    $ac = "RS";
    $acces = "";
    $nombre = 0;
    $result_sql = mysql_query('Select id_nom, acces From admin order by id_nom',$connexion);
	while ($row = mysql_fetch_array($result_sql))
	{ 
		$nombre=substr($row['acces'],4);
	}
	if ($nombre == 0) $nombre = 100110;
	else	$nombre += 1;
		$acces = substr($username,0,2);
		$acces = $ac.$acces.$nombre;
    // date du jour
    $date= $date=date("Y-m-d");
    //codage du mot de passe
    $passwd=sha1($passwd);
    //appel de la fonction d'enregistrement
    register($surname, $name, $adresse, $codep, $ville, $revue, $revue1, $lci, $li, $reseaux, $email, $username, $passwd, $acces, $date);
 
    echo "<font face='verdana' size=1><br><br>Nous vous remercions de vous être inscrit(e)<br>Notez votre code confidentiel :<b> $acces</b>";
?>
-un fichier fns_auth_user.php qui contient ce code
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
require('connect.php');
function register($surname, $name, $adresse, $codep, $ville, $revue, $revue1, $lci, $li, $reseaux, $email, $username, $passwd, $acces, $date)
{
     $sql = "INSERT INTO admin(id_nom, nom, prenom, adresse, code_postal, ville, revue, revue1, lettre_ci, lettre_i, reseaux, email, nom_utilisateur, password, acces, date_inscription) 
	VALUES('','$surname','$name','$adresse','$codep','$ville','$revue','$revue1','$lci','$li','$reseaux','$email','$username','$passwd','$acces','$date')"; 
         $_SESSION['username']=$username;
    // on insère les informations du formulaire dans la table 
    mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
    mysql_close();  // on ferme la connexion 
 
}
?>
Tous ça fonctionne normalement.
Mon problème se situe ici :
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
session_start(); 
if(!empty($_SESSION['username'])) {
      header("Location: index.php?page=reseaux"); 
      exit;
}
// connection à la base de données
require ('connect.php');
?>
<style type="text/css">
.hidden {
    display: none;
}
.visible {
    display: inline;
}
</style>
<Script Language="Javascript">
function hide(identifiant) {
        if (document.getElementById(identifiant).className == "hidden") {
            document.getElementById(identifiant).className = "visible";
        } 
}
</script>
<p align="center">

<form name="interro" method="Post" action="index.php?page=reseaux">
<font color="black" size="2" face="Tahoma" >
<table border="0" style="margin-left:40px; margin-top:20px;">
	<tr>
		<td align="left"><font face="verdana" size="1">
			Pour accéder à la liste des réseaux vous devez avoir souscrit un <a href="index.php?page=abo">abonnement</a> aux réseaux. 
			<br><br>
			Pour accéder à la liste, entrer le code confidentiel qui vous a été communiqué puis valider.<br><br>
		</td>
	<tr>
		<td align="left"><font face="verdana" size="1">Code confidentiel : <input type="text" name="codeconf" value="">
			<input type="submit" name="valid" value="Valider" style="height:20px; font-size:9px">
			<br><br>
		</td>
	</tr>
	<tr>
		<td><font face="verdana" size="1">Code d'accès oublié ?
			<span class="choix" onclick="hide('mondiv')"><font color="blue">cliquer ici</span></td>	</table>

<!-- 
acces aux réseaux
//--> 
<?php
	if (isset($_post['codeconf']))	$code=$_post['codeconf'];
	else $code="";
	$result_sql = mysql_query('Select * From admin',$connexion);
	$nombreligne = mysql_num_rows($result_sql);
	for ($i = 0; $i < $nombreligne; $i++) 
	{
		$codebdd = mysql_result($result_sql,$i,"acces");
		if ($codebdd === $code){
		}
	}
?>
</form>
<!-- 
form pour récupérer le code utilisateur
//-->
<div id="mondiv" class="hidden">
<form name="oubli" method="POST">
<table bgcolor="gold" style="margin-left:210px; margin-top:20px;">
	<tr>
		<td><font face="verdana" size="2">
		<?php
  $username=$_SESSION['username'];

		$result_sql = mysql_query('Select * From admin ',$connexion);
		$nombreligne = mysql_num_rows($result_sql);
		for ($i = 0; $i < $nombreligne; $i++) 
		{
			$code = mysql_result($result_sql,$i,"acces");
			$utilisateurbdd = mysql_result($result_sql,$i,"nom_utilisateur");
			if ($utilisateurbdd === $username){
				echo "Votre code confidentiel :<b> $code";
			}
			}
		?>
		</b></td>
	</tr>
</table>
</form>
</div>
Quand je clic sur (en gras dans le code) Code d'accès oublié ?<span class="choix" onclick="hide('mondiv')"> j'ai le message suivant :
Code :
1
2
3
Warning: session_start(): Cannot send session cookie - headers already sent by (output started at c:\weblocal\sites\reseauxsante\index.php:10) in c:\weblocal\sites\reseauxsante\reseaux_1.php on line 2
 
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\weblocal\sites\reseauxsante\index.php:10) in c:\weblocal\sites\reseauxsante\reseaux_1.php on line 2
J'avoue que ne comprends pas et donc je ne vois pas ce que je dois faire.

Merci de m'aider
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 17h45   #2
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Simplement que tu ne peux pas créer de session après que des données soit déjà envoyé sur le navigateur.
En résumé, il ne faut pas de echo ou autre élément qui s'affiche avant que tu fasse session_start
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 17h59   #3
Membre confirmé
 
Inscription : mars 2003
Messages : 674
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 674
Points : 242
Points : 242
Tu veux dire que je dois pas mettre (en gras)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
  $username=$_SESSION['username'];

		$result_sql = mysql_query('Select * From admin ',$connexion);
		$nombreligne = mysql_num_rows($result_sql);
		for ($i = 0; $i < $nombreligne; $i++) 
		{
			$code = mysql_result($result_sql,$i,"acces");
			$utilisateurbdd = mysql_result($result_sql,$i,"nom_utilisateur");
			if ($utilisateurbdd === $username){
				echo "Votre code confidentiel :<b> $code";
			}
			}
		?>
philippef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2006, 20h55   #4
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Si le session_start se trouve après, non. Cette regle est valable aussi pour les cookie.

Astuce/conseil.
Parfois il arrive que se message apparait alors qu'il y a rien à l'affichage. Il y a une chose à savoir :
___________________________

<? php
....
?>
La barre represente le haut du fichier. Entre le haut et la balise php il y a une ligne vide. Ceci va faire planter session_start et les cookie.
Ce phénomène peut être plus vicieux dans le bas du fichier. Il est parfois difficile de detecter qu'il y a plusieurs ligne vide en bas du fichier. Il suffi qu'il y a ceci

_____________________________________
<?php
.....
?>


__________________________________

Selon l'éditeur utilisé les lignes vide en bas des balises n'est pas visible. Il suffit d'avoir un fichier ainsi dans un include et session_start après et c'est le plantage assuré.
Donc il faut bien vérifié que le haut et le bas du fichier ne possède pas de ligne vide.
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h12.


 
 
 
 
Partenaires

Hébergement Web