За последние 24 часа нас посетили 22982 программиста и 1222 робота. Сейчас ищут 729 программистов ...

Cannot modify header information - headers already sent by

Тема в разделе "PHP для новичков", создана пользователем Taktreba, 26 апр 2017.

  1. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    Да, я знаю что это распространенная ошибка новичков, но все же буду рад если кто то поможет разобраться

    суть - есть простейший сайт (блочная система)
    header, content, menu, footer

    Код (Text):
    1. if (!empty($_GET)) {
    2.     $id = empty($_GET['id']) ? '' : trim(strip_tags($_GET['id']));
    3. }
    4. $blocks = ['header', 'content', 'footer'];
    через форыч вызываются все элементы

    что бы в контенте выводилось содержимое менюшек, например users или калькулятор, или форма sing_up, через GET запрос в switch подключаются include
    Код (Text):
    1. switch ($id) {
    2.                     case 'multi':
    3.                         include 'multi.php';
    4.                         break;
    и так в чем проблема...

    перехожу на sing_up -> в контенте выводятся поля формы регистрации -> после нажатия sent форма переправляет меня на sing_up_hendler.php (чисто код php) где происходит добавление пользователя в блокнот или БД (не важно) в конце скрипта sing_up_hendler.php я поставил header('Location: index.php'); и соответственно после добавления меня должно перенаправлять туда куда я захочу, но этого не происходит ((( я получаю в браузере "Warning: Cannot modify header information - headers already sent by (output started at E:\webserver\OpenServer\domains\clonetable\checkin\sign_up_handler.php:29) in E:\webserver\OpenServer\domains\clonetable\checkin\sign_up_handler.php on line 87"

    я так думаю что это связано с include как то...

    кто чем поможет? ))
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    BOM проверял?
     
  3. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    sing_up_handler.php в блокноте проверил кодировка UTF-8 без BOM
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    E:\webserver\OpenServer\domains\clonetable\checkin\sign_up_handler.php:29 - что у тебя в этой строчке?
     
    Taktreba нравится это.
  5. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    вопрос снимается! так как я не опытный кодер, только что открыл для себя новую инфу - у меня в браузере нотайсы, я их поченил и все заработало. не знал что они тоже как echo перед header воспринимаются
     
    denis01 нравится это.
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Они не как echo и не воспринимаются. Это не встроенная система дискриминации в PHP, сделанная, чтобы новичкам голову морочить. Суть в том, что есть HTTP-протокол. Согласно ему, сообщение состоит из двух частей. Первая часть - заголовки. Вторая - тело сообщения. Заголовки помогают клиенту\серверу понять, что делать с телом. Любые данные, отправленные клиенту, через echo ли, через print ли, либо просто выброшенные в скрипте, в состоянии HTML-mode, либо еще как-то попавшие в поток, с которого сервер собирает ответ, цепляются к ответу. До тех пор, пока мы отправляем заголовки, сервер цепляет заголовки. Когда отправили что-то еще, он цепляет это уже после заголовков. Если мы еще пытаемся отправит заголовок, у сервера наступает диссонанс. Не бывает так, чтобы заголовки после контента цеплялись к сообщению. Вот сервер и ругается.

    Хочешь избегать подобного? Используй буферы вывода. Они накапливают в себе все выводимые данные, в то время как заголовки ими игнорируются и отдаются серверу как есть. Можно даже не инициировать отправку буфера в конце работы скрипта - это произойдет автоматически. В итоге тебе не надо будет архитектуру подгонять под "сначала заголовки, потом данные". Потому что это жесть. При использовании буферов у тебя будет гарантия, что, когда бы ты не выставлял заголовки, они всегда будут в начале сообщения. А контент в конце. Все счастливы. Все работает.
     
    Taktreba нравится это.
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    PHP:
    1. $id = ( $_GET['id'] ?: 0 );
    --- Добавлено ---
    Код (Text):
    1. <?
    2. ob_start ();
    3. header ( 'Location: /', 1, 301 );
    4. exit;
    5. вывод буфера end_buf
    это нормально вообще? включать буфер и убегать
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Ну конкретно в этой вот конкретной ситуации буфер излишним будет. Но даже если это "конь в контекстном вакууме", мол, где-то в стартовой точке открывается буфер, но логика вызова так отрабатывает, что в ряде случаев только заголовок сбрасывается, то ничего страшного и ненормального тут нет. При отработке exit, буфер будет закрыт, а его содержимое передано серверу. Нет содержимого? Ничего не будет передано.

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

    Буферизация - это благо. Это отличная технология. И ее использование - это норма и правильный подход.
     
    MouseZver нравится это.