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.
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
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