Erreur avec session_start()

benassis

Membre confirmé
10 Janvier 2006
73
0
Bonjour,

Je tente depuis quelques jours d'initier une session avec session_start() ; j'ai tout esssayé (et lu divers tutoriels et divers forums) mais je reçois constamment le message d'erreur suivant :
Bloc de code:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /Library/WebServer/Documents/auth2.php:1) in /Library/WebServer/Documents/auth2.php on line 2
Entrez votre nom :
Pourtant, j'utilise le bout de suivant qui vient d'un tutoriel sur les sessions :
Bloc de code:
<?php
session_start();
?>
<html>
<body>
<form method="POST" action="page.php">
Entrez votre nom : <input type="TEXT" name="nom">
<input type="SUBMIT" value="OK">
</form>
</body>
</html>
Il n'y a rien d'écrit avant le session_start().
Cela viendrait-il de mon fichier de configuration? Voici ce que donne phpinfo() sur les sessions :
Bloc de code:
Session Support	enabled
Registered save handlers	files user

Directive	Local Value	Master Value
session.auto_start	Off	Off
session.bug_compat_42	On	On
session.bug_compat_warn	On	On
session.cache_expire	180	180
session.cache_limiter	nocache	nocache
session.cookie_domain	no value	no value
session.cookie_lifetime	0	0
session.cookie_path	/	/
session.cookie_secure	Off	Off
session.entropy_file	no value	no value
session.entropy_length	0	0
session.gc_divisor	100	100
session.gc_maxlifetime	1440	1440
session.gc_probability	1	1
session.name	PHPSESSID	PHPSESSID
session.referer_check	no value	no value
session.save_handler	files	files
session.save_path	/tmp	/tmp
session.serialize_handler	php	php
session.use_cookies	On	On
session.use_only_cookies	Off	Off
session.use_trans_sid	Off	Off
Y a-t-il quelque chose d'irrégulier ?

Merci de m'aider
 
Salut!

rien d'irrégulier apparement.

tu obtiens l'erreur quant tu accède à ce fichier directement? (et non via une inclusion?)

si oui je suppose que tu a fait un copier coller de ton tuto et tu a du choper des caractères illégaux. vérifie l'encodage de ton fichier et vire les caractères invisibles qui doivent trainer!
(enfin tu aura plus vite fait de re taper à la main dans un bo fichier propre et neuf ce petit bout de code!)

++
 
****
rien d'irrégulier apparement.

tu obtiens l'erreur quant tu accède à ce fichier directement? (et non via une inclusion?)

****

Bonjour Zeusviper,

Je ne comprends pas ce que tu entends par «inclusion». De toute façon, le premier fichier est un formulaire qui demande un no de membre et un mot de passe et dont la destination (action=auth2.php) avec la method post est le fichier "auth2.php" qui contient le session_start[]; le mot de passe utilise un champ hidden comme ceci :
Bloc de code:
<input type='hidden' name='md5'
. Après validation, le mot de passe est converti en md5 comme ceci par une routine jvs:
Bloc de code:
function submit_pass()
{
  pass=document.forms['log'].passwd.value;
  document.forms['log'].passwd.value="";
  buf=MD5(pass);
  document.forms['log'].md5.value=buf;

  document.forms['log'].submit;
  return false;
}
Se peut-il que la donnée md5 passant par la methode post provoque un tel comportement ? Si oui, comment puis-je éviter cela ?
***
si oui je suppose que tu a fait un copier coller de ton tuto et tu a du choper des caractères illégaux. vérifie l'encodage de ton fichier et vire les caractères invisibles qui doivent trainer!
(enfin tu aura plus vite fait de re taper à la main dans un bo fichier propre et neuf ce petit bout de code!)

***
J'ai fait ce que tu me dis ; j'ai copié à la main seulement ceci :
Bloc de code:
<?php
session_start();
?>
, dans un fichier neuf et la même erreur revient.
Merci pour tes lumières
 
par inclusion je parlais de la commande require ou include mais puisque ce n'est pas le cas..

md5 et les traitements qui ont lieu sur la page précédente ne devraient pas affecter la session.

c étrange, si tu tape uniquement
Bloc de code:
<?php
session_start();
?>

dans un fichier et que tu ouvre ce fichier directement tu obtiens tjrs une erreur??
si oui, tu tapes avec quel logiciel ton code? probablement un pb de format ou d'encodage.

si non, poste exactement le code de tes 2 pages ici pour voir!

++

PS : il ya la balise quote pour les citations! ;-)
 
Captain_X a dit:
10 contre 1 que la merde vient du formulaire

pourquoi se faire chier avec du JS alors tu peux le faire en PHP et que ca marchera bien mieux

Je ne sais pas trop pourquoi : j'ai simplement repris un tuto sur les session en php ici :
http://bob.developpez.com/phpauth/
que j'ai tenté d'adapter à mes besoins.
Est-ce que l'utilisation d'une commande php pour le md5 va régler mon problème de session_start() ?
 
je ne vois pas cette ligne
Bloc de code:
document.forms['log'].submit;
dans le tuto donc pourquoi l'avoir mis? (je ne sais pas si c'est ca l'erreur! il faudrait voir tes fichiers exacts)
 
Zeusviper a dit:
par inclusion je parlais de la commande require ou include mais puisque ce n'est pas le cas..

md5 et les traitements qui ont lieu sur la page précédente ne devraient pas affecter la session.

c étrange, si tu tape uniquement
Bloc de code:
<?php
session_start();
?>

dans un fichier et que tu ouvre ce fichier directement tu obtiens tjrs une erreur??
si oui, tu tapes avec quel logiciel ton code? probablement un pb de format ou d'encodage.

si non, poste exactement le code de tes 2 pages ici pour voir!

++

PS : il ya la balise quote pour les citations! ;-)
À ton invitation Zeusviper, voici mon code complet:
Mon formulaire, login.html
Bloc de code:
<html>
<head>
<title>Login.html</title>
<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1' />
<script language="javascript" type="text/javascript" src="login.js"></script>
<script language="javascript" type="text/javascript"> 
function validation() 
       	if(document.formulaire.login.value == "") 
		{ 
        alert ('Veuillez entrer votre numéro de membre sur le CMQ'); 
        document.formulaire.login.focus(); 
        return false; 
    	}
				if(document.formulaire.passwd.value == "") 
		{ 
        alert ('Veuillez entrer votre mot de passe'); 
        document.formulaire.passwd.focus(); 
        return false; 
    	}
		else {
submit_pass();
}
</script> 
</head>
<body>
<form id='log' action="auth2.php" method="post" name="formulaire" onsubmit="return validation();"> 
Votre num&eacute;ro du membre sur le CMQ : <input type="text" name="login" size="10"><br>
Votre mot de passe sur le CMQ:<input type="text" name="passwd" size="10"><br>
<input type='hidden' name='md5' />
<input type="submit" name="envois" value="Entrez">&nbsp;&nbsp;
<input type="reset" value="Effacer" >
</body>

Mon fichier jvs :
Bloc de code:
function submit_pass()
{
  pass=document.forms['log'].passwd.value;
  document.forms['log'].passwd.value="";
  buf=MD5(pass);
  document.forms['log'].md5.value=buf;

  document.forms['log'].submit;
  return false;
}

Mon fichier original, appelé auth2.php, avant que je ne sois rendu à tester le session_start();
Bloc de code:
<? 
$md5=$_POST['md5'];
$login=$_POST['login'];
$fileloging = 'logs.txt';
if(!file_exists($fileloging))
{//file
echo "<h4><p>Ce fichier n'existe pas !</p>";
}///file
$c=0;
$fd = fopen($fileloging,"r") or die("On ne peut ouvrir ce fichier");
        while ($ligne = fgetcsv($fd, 1024)) {//1
                foreach($ligne as $elem) {//2       
        $occur= stristr($elem,$login);
        if($occur !== False)
        	{//3
        	$occur_num= $c; 
        	$trouve =$occur;
        	}//3
 $c++;           
        }//2
    }//1
   fclose ($fd);
if($occur_num ==="")     // Si aucun numéro de membre n'existe la variable est vide
{//1
echo "<hr color='#ff0000' noshade align=left>";
echo "<h4><p class='margin'>Ce num&eacute;ro de membre n'est pas dans notre base de données.</p>";
echo "<FORM Method='GET' action='login.html'>";
echo "<p class='margin'><INPUT type=submit value=Recommencer><BR>";
echo "<hr color='#ff0000' noshade align=left></h4>";
}//1
else{//1
$lignelog =explode(' ',$trouve);

$passmem= $lignelog[0];
$passmd5=$lignelog[2];
if ($login<>$passmem){//2
echo "<hr color='#ff0000' noshade align=left>";
echo "<h4><p class='margin'>Malheureusement, ce num&eacute;ro de membre nous est inconnu.</p>";
echo "<h4><p class='margin'>Veuillez recommencer !</p>";
echo "<FORM Method='GET' action='login.html>";
echo "<p class='margin'><INPUT type=submit value=Recommencer><BR>";
echo "<hr color='#ff0000' noshade align=left></h4>";
}//-2
if ($md5<>$passmd5)
{//2
 echo "<hr color='#ff0000' noshade align=left>";
echo "<h4><p class='margin'>Malheureusement, mot de passe est invalide !</p>";
echo "<h4><p class='margin'>Veuillez recommencer !</p>";
echo "<FORM Method='GET' action='login.html'>";
echo "<p class='margin'><INPUT type=submit value=Recommencer><BR>";
echo "<hr color='#ff0000' noshade align=left></h4>";
}//-2
}
session_start();
$_SESSION['last_access']=time();
$_SESSION['ipaddr']=$_SERVER['REMOTE_ADDR'];
$_SESSION['user']=$login;

header("Location:page.php");
?>
À noter que la commande header me donne aussi un message d'erreur similaire et que ce code est fortement inspiré de celui présenté ici :
http://bob.developpez.com/phpauth/ qui devait bien fonctionner avant de servir de tuto.

Voilà
 
Alors qq commentaires :
1 quitte à suivre un tuto, trouve en un meilleur! http://beaussier.developpez.com/articles/php/session/ par ex pour les session me parait bien mieux ficelé, ne te borne pas à un tuto, lis en plusieurs, par ordre de difficulté, rien ne sert de tt faire en meme tps!

2 fais du code propre dès le début ce sera plus facile ensuite!
(balises ouvertes doivent être fermées,
indentation du code,
javascript ne doit servir qu'a des fins de vérification et jamais de traitement de données,
si dans une fonction tu utilise return, assure toi 1 que tu en ai besoin, 2 que tu retourne une valeur dans tt les cas
...
)

et pour ton pb : dans ton fichier auth2 tu écris des tonnes de choses vie les balises echo avant de faire appel à session_start donc c évident que ca risque pas de marcher!!
(accesoirement php n'est pas fait pour générer du code html via la commande echo c moche et malsain.)

Bon courage!!
 
Zeusviper a dit:
Alors qq commentaires :
1 quitte à suivre un tuto, trouve en un meilleur! http://beaussier.developpez.com/articles/php/session/ par ex pour les session me parait bien mieux ficelé, ne te borne pas à un tuto, lis en plusieurs, par ordre de difficulté, rien ne sert de tt faire en meme tps!
Zeusviper a dit:
Reçu ! Merci !

2 fais du code propre dès le début ce sera plus facile ensuite!
(balises ouvertes doivent être fermées,
indentation du code,
javascript ne doit servir qu'a des fins de vérification et jamais de traitement de données,
si dans une fonction tu utilise return, assure toi 1 que tu en ai besoin, 2 que tu retourne une valeur dans tt les cas
...
)

Je ne connais pas grand chose à jvs ; je suis débutant sur les langages web. Mais je prends note !

et pour ton pb : dans ton fichier auth2 tu écris des tonnes de choses vie les balises echo avant de faire appel à session_start donc c évident que ca risque pas de marcher!!
(accesoirement php n'est pas fait pour générer du code html via la commande echo c moche et malsain.)

Je comprends ceci mais ça n'explique pas pourquoi j'ai le message d'erreur même lorsque j'ai seulement session_start() dans ma routine, comme celle que je t'ai montrée ci-haut.
Merci quand même !
 
Rebonjour Zeusviper,

Tu avais raison de me demander avec quel éditeur je travaillais. Je travaille avec Bbedit 8.2.4. En regardant le fichier avec Xexedit j'ai découvert des codes en début de page juste avant le signe d'ouverture du php «<?» ; ce code est le suivant :
Bloc de code:
Ôªø<?
J'ai enlevé ces codes et le session_start() fonctionne ! Mais toutes les fois que je sauvegarde ces codes reviennent. Comme ça a rapport avec l'encodage, j'ai vérifié mes préférences de BBedit et je vois que les encodages suivants sont cochés:
Unicode utf-8
Unicode utf-8, no Bom
Unicode utf-16 Little indian, no Bom
Unicode utf-16
Unicode utf-16, no Bom
Cependant, tous ces derniers apparaissent grisonnés et je ne peux les désarmorcer.

Il y a ensuite :

Western dos latin 1
Western iso latin 1
Western iso latin 6
Western Mac os roman
Western windows latin 1

Que me conseille-tu de faire ?
Mercdi
 
il te faut enregistrer avec un encodage non bom (le bom est qq infos(les fameux caractères bizarres que tu vois!) mis en début de fichier qui identifient l'encodage utilisé mais donc qui ne doit surtt pas se trouver sur des fihciers php!)

donc utilise soit un utf8 no bom, soit un iso latin 1.

je ne connais pas vraiment bbedit! mais tu trouvera dans le forum plein de fils qui parlent de quel editeurs texte choisir. (perso j'utilise textmate et subethaedit qui me satisfont pleinement)


PS : si tu ne connais pas spécialement le javascript, ne t'embete pas à l'apprendre, c lourd et de plus en plus inutile surtt pour un débutant! et surtt jamais de traitement de données via le javascript! ;)