За последние 24 часа нас посетили 16066 программистов и 1666 роботов. Сейчас ищут 935 программистов ...

Не переадресовывает header()

Тема в разделе "PHP для новичков", создана пользователем Magnum, 3 май 2016.

  1. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Привет, мастера. Пишу скрипт на локалке. И не получается переадресовать на другую страницу через header()

    пишет:
    Warning: Cannot modify header information - headers already sent by (output started at C:\OpenServer\domains\portfolio\conf\style.php:6) inC:\OpenServer\domains\portfolio\works\index.php on line 8

    Я так понимаю, что уже передаётся заголовок, и его изменить нельзя, но я ума не приложу, что я делаю не так.

    код style.php
    PHP:
    1. <?php
    2.  
    3. echo '<title>Портфолио</title>
    4. <link rel="stylesheet" href="../style/style.css" type="text/css" />
    5. <link rel="stylesheet" href="../style/font-awesome.min.css" type="text/css" /">
    6. <link rel="shortcut icon" href="favicon.ico"/>';
    7.  
    8.  
    9. ?>

    И код, откуда я планирую переадресовать:
    PHP:
    1. <?php
    2.  
    3. require '../conf/config.php';
    4. require '../conf/style.php';
    5. require '../conf/head.php';
    6.  
    7. $q = $db -> query("SELECT * FROM `works` WHERE `id` = '".$_GET['id']."' LIMIT 1");
    8. if ($q -> num_rows == '0') { header("Location: /");exit; }
    9.  
    10. $res = $q -> fetch_array();
    11.  
    12. echo $res['name'];
    13.  
    14. require '../conf/foot.php';
    15.  
    16. ?>

    Заранее благодарю за подсказку, и помощь в решении проблемы ;)
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    все верно машина пишет. при подключении четвертой строкой файла стайл его содержимое (файла стайл) завершает раздел заголовков и начинает мусорить данными в поток. после этого вдруг появляется желание послать заголовок, но этого сделать уже не получается ибо читать выше.
    решение? пересмотреть алгоритм чтоб шаблонная часть шла уже после всей логики работы с данными. ну или самое простое для новичка - буферизация выходного потока. создал буфер, нагадил в него. если надо редирект - редирект. если не надо редирект - показал и убил буфер.
     
    Magnum нравится это.
  3. Magnum

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

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Спасибо, буду пробовать)
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    пишет, что на шестой строке уже пошел вывод, поэтому надо смотреть, что там у тебя на шестой строке происходит.

    ob_start() и ob_get_clean() - лучшие друзья пхпшника, чо. Никуда от этого не уйти.
     
  5. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    @Magnum, сначала почему так:
    Заголовки должны выводиться ДО любого вывода. Потому что так устроен протокол http — в сообщении идут сначала заголовки, затем тело сообщения.
    Когда ты делаешь echo или закрываешь ?> и что-то там пишешь, это уже тело, после него заголовки не работают: об этом говорится в тексте ошибки: "headers already sent" — "заголовки уже были посланы".
    Понял?

    Теперь как обойти:
    Выводи "тело" только в конце работы. Или перехватывай весь вывод функциями ob_* и выводи перехваченное в конце.
     
    #5 artoodetoo, 3 май 2016
    Последнее редактирование: 3 май 2016