2009-04-03 9 views
4

Voici les premières lignes de ma page:Pourquoi ne puis-je pas utiliser session_start() dans mon script PHP? Il est dit en-têtes sont déjà envoyés

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<?php include_once "dblogin.php"; 
session_start(); 
$loggedIn = 0; 
if(isset($_SESSION["login"])) {$loggedIn = 1;} 
?> 

que je reçois l'erreur suivante:

Impossible d'envoyer cookie de session - têtes déjà envoyés par (output started at /usr/www/users/simpleof/index.php:2) dans /usr/www/users/simpleof/index.php à la ligne 2

D'après ce que j'ai lu sur d'autres forums, ça devrait aller parce que le session_start() est dans le premier bloc de code php, mais je reçois toujours cette erreur.

+0

sessions doivent être démarrées avant toute sortie est envoyée, car il utilise des cookies qui sont spécifiés dans l'en-tête d'une requête HTTP, qui est évidemment envoyé avant le corps de la demande. – moo

+0

Il doit y avoir quelque chose dans dblogin.php qui écrit au client. Une fois que l'écriture au client a commencé, vous ne pouvez plus envoyer d'en-têtes (et le démarrage d'une session envoie un en-tête qui indique au client de créer le cookie d'identifiant de session php). Vous pouvez contourner ceci en définissant le tampon de sortie. – Rich

Répondre

5

Vous avez mal lu ou les autres forums sont erronés. Juste parce que session_start() est dans le premier "bloc" de code PHP ne signifie pas que cela va fonctionner.

session_start() doit être exécuté avant l'envoi des en-têtes.

La solution dans votre cas est:

Déplacer session_start(); ci-dessus <!DOCTYPE html ...

6

Voilà comment fonctionne le protocole HTTP:

Vous envoyez ce type d'en-tête avec votre navigateur:

GET /questions/712326/why-cant-i-use-sessionstart-in-my-php-script-it-says-headers-are-already-sen HTTP/1.1 
Host: stackoverflow.com 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8 (.NET CLR 3.5.30729) 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: fi-fi,fi;q=0.8,en-us;q=0.5,en;q=0.3 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 300 
Connection: keep-alive 
Referer: http://stackoverflow.com/questions/tagged/php 
Cookie: *censored* 
Cache-Control: max-age=0 

premier serveur vous envoie les en-têtes:

HTTP/1.x 200 OK 
Cache-Control: private 
Content-Type: text/html; charset=utf-8 
Content-Encoding: gzip 
Expires: Fri, 03 Apr 2009 02:14:49 GMT 
Vary: Accept-Encoding 
Server: Microsoft-IIS/7.0 
Set-Cookie: *censored* 
Date: Fri, 03 Apr 2009 02:14:49 GMT 
Content-Length: 9346 

Ensuite, le serveur vous envoie le réel données de page

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" > 
<html> 
<head>  

    <title>Why can't I use session_start() in my php script? It says headers are already sent. - Stack Overflow</title> 
    <link rel="stylesheet" href="/Content/all.min.css?v=2743"> 
    ..snip.. 

Ainsi, vous voyez que vous ne pouvez pas d'abord envoyer des données HTML (DOCTYPE), puis des données d'en-tête car l'en-tête est déjà traité. Vous pouvez faire le tour avec PHP Output Control mais plus recommandé est que vous utilisez MVC design où vous tampon toutes les données que l'utilisateur voit en dernier.

Questions connexes