0

Доброго времени суток. Не понимаю в чём ошибка в коде. В браузере вылезает ошибка при редиректе на другой файл - Cannot modify header information - headers already sent by. Объясните, где я накосячил? В интернете искал инфу, понял примерно суть ошибки, но как её исправить не знаю. Уже и хтмл код удалял, и все пробелы с пустыми строками смотрел, не могу понять в чём проблема.

<!DOCTYPE  HTML>
        <html>
        <meta charset="utf-8">
        </html>
    <?php
    if (isset($_POST['login'])) 
        { 
            $login = $_POST['login']; 
        } 
        if (isset($_POST['password'])) 
            { 
                $password=$_POST['password']; 
            }  
        $login = stripslashes($login);
        $login = htmlspecialchars($login);
        $password = stripslashes($password);
        $password = htmlspecialchars($password);
        $login = trim($login);
        $password = trim($password);
        include ("bd.php"); 
        $result = mysql_query("SELECT * FROM users WHERE login='$login'",$db); 
        $myrow = mysql_fetch_array($result);
        if (empty($myrow['password']))
        {
            exit ("Извините, введённый вами login или пароль неверный.");
        }
        else 
            {
                if ($myrow['password']==$password) 
                    {
                        $_SESSION['login']=$myrow['login']; 
                        $_SESSION['id']=$myrow['id'];
                        //echo "Вы успешно вошли на сайт! <a href='index.php'>Главная страница</a>";
                        header('Location: http://localhost/practice/main.php/');
                        exit;
                    }       
                 else 
                    {
                        exit ("Извините, введённый вами login или пароль неверный.");
                    }
            }
    ?>
  • 1
    Просто перенесите вывод перед тегом <?php в вашем примере после кода. То есть сначала выполняйте код, решайте, что будет на странице, а только потом выводите, когда уже все порешаете и посчитаете – wirtwelt Apr 09 '18 at 12:46
  • Перенесите весь php-код вверх вашего файла, и обратите внимание, что бы перед открывающим тегом <?php не было ни пробелов, ни пустых строк. Весь HTML должен быть расположен под php. – Эдуард Apr 09 '18 at 12:46
  • @Эдуард Перенёс php код вверх файла, пустых строк и пробелов нету. HTML внизу, ничего не изменилось к сожалению :( – SnoopDoggyDog Apr 09 '18 at 13:02
  • Тогда проверяйте кодировку файла - должна быть UTF-8 без BOM – Эдуард Apr 09 '18 at 13:09

1 Answers1

1

PHP при выводе результата работы скрипта использует буферизацию

Обычный HTTP-протокол состоит из двух условных секций: заголовки HTTP и тело страницы. PHP генерирует как правило тело страницы, но управление заголовками ему тоже доступно, с помощью функции header() например

Однако есть ограничение - нельзя отправить кусок тела HTTP, а потом поменять header, поскольку он идет ДО тела HTTP

Чтобы этого избежать используют конструкции следующего вида:

ob_start();
$page = SomeFunctionOrClassMethod();
print $page;
ob_flush();

Здесь под SomeFunctionOrClassMethod() понимают что-то, что будет генерировать для вас эту страницу. В процессе генерации может возникнуть ситуация, когда надо будет записать header - не вопрос, благодаря ob_start() вывода в поток HTTP еще не было. Вывод будет только при вызове ob_flush()

wirtwelt
  • 1,455
  • 9
  • 14