Вот первые несколько строк моей страницы:
<!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-кода, но я все еще получаю эту ошибку.
Вы либо неправильно читаете, либо другие форумы ошибаются. Просто потому, что session_start()
находится в первом «блоке» кода PHP, это не значит, что он будет работать.
session_start()
должен быть запущен до отправки заголовков.
Решение в вашем случае:
Переместить session_start();
выше <!DOCTYPE html
…
Вот как работает протокол 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) и затем данные заголовка, поскольку заголовок уже обработан. Вы можете обойтись с помощью Output Control для PHP, но больше рекомендуется использовать дизайн MVC, где вы буферизируете все данные, которые пользователь видит последним.