Да, я знаю что это распространенная ошибка новичков, но все же буду рад если кто то поможет разобраться суть - есть простейший сайт (блочная система) header, content, menu, footer Код (Text): if (!empty($_GET)) { $id = empty($_GET['id']) ? '' : trim(strip_tags($_GET['id'])); } $blocks = ['header', 'content', 'footer']; через форыч вызываются все элементы что бы в контенте выводилось содержимое менюшек, например users или калькулятор, или форма sing_up, через GET запрос в switch подключаются include Код (Text): switch ($id) { case 'multi': include 'multi.php'; 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 как то... кто чем поможет? ))
E:\webserver\OpenServer\domains\clonetable\checkin\sign_up_handler.php:29 - что у тебя в этой строчке?
вопрос снимается! так как я не опытный кодер, только что открыл для себя новую инфу - у меня в браузере нотайсы, я их поченил и все заработало. не знал что они тоже как echo перед header воспринимаются
Они не как echo и не воспринимаются. Это не встроенная система дискриминации в PHP, сделанная, чтобы новичкам голову морочить. Суть в том, что есть HTTP-протокол. Согласно ему, сообщение состоит из двух частей. Первая часть - заголовки. Вторая - тело сообщения. Заголовки помогают клиенту\серверу понять, что делать с телом. Любые данные, отправленные клиенту, через echo ли, через print ли, либо просто выброшенные в скрипте, в состоянии HTML-mode, либо еще как-то попавшие в поток, с которого сервер собирает ответ, цепляются к ответу. До тех пор, пока мы отправляем заголовки, сервер цепляет заголовки. Когда отправили что-то еще, он цепляет это уже после заголовков. Если мы еще пытаемся отправит заголовок, у сервера наступает диссонанс. Не бывает так, чтобы заголовки после контента цеплялись к сообщению. Вот сервер и ругается. Хочешь избегать подобного? Используй буферы вывода. Они накапливают в себе все выводимые данные, в то время как заголовки ими игнорируются и отдаются серверу как есть. Можно даже не инициировать отправку буфера в конце работы скрипта - это произойдет автоматически. В итоге тебе не надо будет архитектуру подгонять под "сначала заголовки, потом данные". Потому что это жесть. При использовании буферов у тебя будет гарантия, что, когда бы ты не выставлял заголовки, они всегда будут в начале сообщения. А контент в конце. Все счастливы. Все работает.
PHP: $id = ( $_GET['id'] ?: 0 ); --- Добавлено --- Код (Text): <? ob_start (); header ( 'Location: /', 1, 301 ); exit; вывод буфера end_buf это нормально вообще? включать буфер и убегать
Ну конкретно в этой вот конкретной ситуации буфер излишним будет. Но даже если это "конь в контекстном вакууме", мол, где-то в стартовой точке открывается буфер, но логика вызова так отрабатывает, что в ряде случаев только заголовок сбрасывается, то ничего страшного и ненормального тут нет. При отработке exit, буфер будет закрыт, а его содержимое передано серверу. Нет содержимого? Ничего не будет передано. Я тебе больше скажу, в конфиге php можно выставить параметр, указывающий PHP, что буфер должен открываться всегда при старте приложения. Даже ob_start() писать в точке входа не понадобится. Буферизация - это благо. Это отличная технология. И ее использование - это норма и правильный подход.