Почему я не могу использовать session_start () в своем скрипте php? Это говорит, что заголовки уже отправлены - PullRequest
4 голосов
/ 03 апреля 2009

Вот первые несколько строк моей страницы:

<!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;}
?>

Я получаю следующую ошибку:

Невозможно отправить cookie сеанса - заголовки уже отправлены (вывод начался с /usr/www/users/simpleof/index.php:2) в /usr/www/users/simpleof/index.php в строке 2

Из того, что я читал на других форумах, это должно быть хорошо, потому что session_start () находится в первом блоке кода php, но я все еще получаю эту ошибку.

Ответы [ 2 ]

6 голосов
/ 03 апреля 2009

Вот как работает протокол HTTP :

Вы отправляете этот вид заголовка в браузере:

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

Первый сервер отправляет вам заголовки:

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

Затем сервер отправляет вам фактические данные страницы

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

Итак, вы видите, что вы не можете ПЕРВЫЙ отправить данные HTML (DOCTYPE), а затем данные заголовка, потому что заголовок уже обработан. Вы можете использовать PHP 101 * * Output Control , но рекомендуется использовать MVC дизайн, в котором вы буферизуете все данные, которые пользователь видит последними.

5 голосов
/ 28 апреля 2009

Вы либо неправильно прочитали, либо другие форумы не правы. Тот факт, что session_start() находится в первом «блоке» кода PHP, не означает, что он будет работать.

session_start() необходимо запустить перед отправкой заголовков.

Решение в вашем случае:

Перемещение session_start(); выше <!DOCTYPE html ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...