За последние 24 часа нас посетили 49982 программиста и 1733 робота. Сейчас ищут 736 программистов ...

Как справиться с ошибкой header('Location: )

Тема в разделе "PHP для новичков", создана пользователем RazerVG, 17 янв 2015.

  1. RazerVG

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

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Структура сайта такая:
    Главный файл index.php

    Код (PHP):
    1. $cabinet_select = empty($_GET['cabinet_select']) ? 'index' : $_GET['cabinet_select'];
    2. $cabinet_manager = empty($_GET['cabinet_manager']) ? 'index' : $_GET['cabinet_manager'];
    3.  
    4. include($_SERVER['DOCUMENT_ROOT'].'/views/layouts/index.php');
    5.  
    Подключаемый index.php

    Код (PHP):
    1. <!doctype html>
    2. <html>
    3.     <head>
    4.         <title>Личный кабинет для сотрудников ООО "Одеон"</title>
    5.         <link rel="stylesheet" href="../../style.css" type="text/css">
    6.         <meta charset="utf-8">
    7.     </head>
    8.     <body>
    9.     <header>
    10.  
    11.     </header>
    12.     <main>
    13.         <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?>
    14.     </main>
    15.     <footer>
    16.  
    17.     </footer>
    18.     </body>
    19. </html>
    Далее подключаемый по умолчанию файл index.php

    Код (PHP):
    1. <h2>Вход в личный кабинет для сотрудников ООО "ПК Одеон"</h2>
    2. <form action="index.php" method="post" name="login_form">
    3.     <p><label for="email">Email:</label>
    4.         <input type="email" id="email" name="email" value=""><p>
    5.     <p><label for="password">Пароль:</label>
    6.         <input type="password" id="password" name="password" value=""><p>
    7.     <p><input type="submit" name="login_button" value="Войти"></p>
    8. </form>
    9.  
    10. <?php
    11.     $submit=$_POST['login_button'];
    12.     if(isset($submit))
    13.     {
    14.         include($_SERVER['DOCUMENT_ROOT'].'/function/login_manager.php');
    15.     }
    16.     else
    17.     {
    18.         echo "Кнопка не нажата";
    19.     }
    20. ?>
    Подключаемый файл для проверки логина и пароля

    Код (PHP):
    1. <?php
    2.     if(isset($_POST['email'])) {$email = $_POST['email'];
    3.         if ($email == ''){ unset($email);}}
    4.     if(isset($_POST['password'])) {$password = $_POST['password'];
    5.         if ($password == ''){ unset($password);}}
    6.     if(empty($email) or empty($password)) {
    7.         echo "Заполните все поля!";
    8.     }
    9.  
    10.     db_connect();
    11.  
    12.     $query = "SELECT * FROM managers WHERE email='$email'";
    13.  
    14.     $result = mysql_query($query);
    15.  
    16.     $myrow = mysql_fetch_array($result);
    17.  
    18.     if(empty($myrow['password'])){
    19.         echo "Извините, введенный вами Email или Пароль неверный.";
    20.     } else {
    21.         if ($myrow['password'] == $password) {
    22.             $_SESSION['email'] = $myrow['email'];
    23.             $_SESSION['id'] = $myrow['id_client'];
    24.             header('Location: index.php?cabinet_select=cabinet_manager');
    25.         }
    26.         else{
    27.             echo "Извините, Пароль неверный";
    28.         }
    29.     }
    30. ?>
    И вот тут как раз и ошибка, после проверки логина и пароля в случае успеха я перехожу по ссылке header('Location: index.php?cabinet_select=cabinet_manager'); , но веб-сервер пишет ошибку, что путь ему сообщили и указывает на эту строку <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?> из файла подключаемого в самом начале. Как это исправить сильно не меняя структуры ?
     
  2. Ganzal

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

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

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

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Спасибо за подробное объяснение. А как исправить это. Какой функцией мне сделать перенаправление в случае успеха, при проверке.
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну либо делать через html раз мы его уже выводим. либо НЕ выводить html-содержимое до тех пор пока оно не будет готово. можно через буферизацию вывода или через нормальную архитектуру приложения.
     
  5. RazerVG

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

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    То есть сразу после проверки выводить, то что нужно выводить. Ну это понятно. Но мне так не подойдет.

    Этот метод я не понял.

    Где можно про нее прочитать.

    У меня была такая уже проблема, но я исправлял ее так: в главном файле index.php создавал switch() и case описывал значения и оттуда Location как раз работал.
     
  6. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    почему? чем плох редирект через html? при нулевом понимании алгоритмизации это чуть ли не единственный выход из ситуации.
     
  7. RazerVG

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

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    Просто, страница которую я загружаю тоже будет иметь свой изменяющийся слой. Это форма для входа в личный кабинет.
     
  8. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    И что? Ну авторизовался человек - показали ему страницу и её же и заминировали правилами перехода. Через рефреш в заголовках, через рефреш в исходнике гипертекста, через джаваскрипт, или просто ссылку дали на нужный элемент. Аж четыре варианта.
     
  9. RazerVG

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

    С нами с:
    5 дек 2013
    Сообщения:
    103
    Симпатии:
    0
    То есть у меня к примеру как я написал есть страница

    Код (PHP):
    1. <!doctype html>
    2. <html>
    3.     <head>
    4.         <title>Личный кабинет для сотрудников ООО "Одеон"</title>
    5.         <link rel="stylesheet" href="../../style.css" type="text/css">
    6.         <meta charset="utf-8">
    7.     </head>
    8.  
    9.     <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?>
    10.  
    11. </html>
    Первый слой который я загружаю это слой проверки Логина и Пароля
    Код (PHP):
    1. <body>
    2. <header>
    3.  
    4. </header>
    5. <main>
    6.     <h2>Вход в личный кабинет для сотрудников ООО "ПК Одеон"</h2>
    7.     <form action="index.php" method="post" name="login_form">
    8.         <p><label for="email">Email:</label>
    9.             <input type="email" id="email" name="email" value=""><p>
    10.         <p><label for="password">Пароль:</label>
    11.             <input type="password" id="password" name="password" value=""><p>
    12.         <p><input type="submit" name="login_button" value="Войти"></p>
    13.     </form>
    14. </main>
    15. <footer>
    16.  
    17. </footer>
    18. </body>
    19. <?php
    20. $submit=$_POST['login_button'];
    21. if(isset($submit))
    22. {
    23.     include($_SERVER['DOCUMENT_ROOT'].'/function/login_manager.php');
    24. }
    25. else
    26. {
    27.     echo "Кнопка не нажата";
    28. }
    29. ?>
    А после удачной проверки Логина и Пароля, мне необходимо изменить $cabinet_select c значения по умолчанию index на другое и сделать перезагрузку страницы. Что значит заминировать?

    Добавлено спустя 12 минут 47 секунд:
    То есть как я понял, мы из нижнего слоя не можем менять значение вышестоящего ? Как в javascript области видимости. Что то на подобии этого.
     
  10. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    после закрытия стакана боди ты продолжаешь выводить страничный контент. откуда такие гении алгоритмизации берутся?