Структура сайта такая: Главный файл index.php Код (PHP): $cabinet_select = empty($_GET['cabinet_select']) ? 'index' : $_GET['cabinet_select']; $cabinet_manager = empty($_GET['cabinet_manager']) ? 'index' : $_GET['cabinet_manager']; include($_SERVER['DOCUMENT_ROOT'].'/views/layouts/index.php'); Подключаемый index.php Код (PHP): <!doctype html> <html> <head> <title>Личный кабинет для сотрудников ООО "Одеон"</title> <link rel="stylesheet" href="../../style.css" type="text/css"> <meta charset="utf-8"> </head> <body> <header> </header> <main> <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?> </main> <footer> </footer> </body> </html> Далее подключаемый по умолчанию файл index.php Код (PHP): <h2>Вход в личный кабинет для сотрудников ООО "ПК Одеон"</h2> <form action="index.php" method="post" name="login_form"> <p><label for="email">Email:</label> <input type="email" id="email" name="email" value=""><p> <p><label for="password">Пароль:</label> <input type="password" id="password" name="password" value=""><p> <p><input type="submit" name="login_button" value="Войти"></p> </form> <?php $submit=$_POST['login_button']; if(isset($submit)) { include($_SERVER['DOCUMENT_ROOT'].'/function/login_manager.php'); } else { echo "Кнопка не нажата"; } ?> Подключаемый файл для проверки логина и пароля Код (PHP): <?php if(isset($_POST['email'])) {$email = $_POST['email']; if ($email == ''){ unset($email);}} if(isset($_POST['password'])) {$password = $_POST['password']; if ($password == ''){ unset($password);}} if(empty($email) or empty($password)) { echo "Заполните все поля!"; } db_connect(); $query = "SELECT * FROM managers WHERE email='$email'"; $result = mysql_query($query); $myrow = mysql_fetch_array($result); if(empty($myrow['password'])){ echo "Извините, введенный вами Email или Пароль неверный."; } else { if ($myrow['password'] == $password) { $_SESSION['email'] = $myrow['email']; $_SESSION['id'] = $myrow['id_client']; header('Location: index.php?cabinet_select=cabinet_manager'); } else{ echo "Извините, Пароль неверный"; } } ?> И вот тут как раз и ошибка, после проверки логина и пароля в случае успеха я перехожу по ссылке header('Location: index.php?cabinet_select=cabinet_manager'); , но веб-сервер пишет ошибку, что путь ему сообщили и указывает на эту строку <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?> из файла подключаемого в самом начале. Как это исправить сильно не меняя структуры ?
чо-чо??? может он пишет что хидерс олреди сент? заголовки уже отправлены? ну в миллиардный раз для забаненых в любой поисковой системе рассказываю. это протокол передачи гипертекста. сообщение между клиентом и сервером содержит две части - заголовки и тело. в случае ответа от сервера - тело и есть сама страничка. а в заголовках всякая техническая информация. как ты можешь догадаться функция хидер с аргументом локейшн - это установка заголовка локейшин в пакете заголовков. но заголовки идут всегда перед боди. когда ты рисуешь страницу как у тебя в листингах - пхп отдает это содержимое веб-серверу как боди. и раз уже боди пошло то нужно сначала заголовки отправить. что веб-сервер и делает. и клиент получает заголовки, потом кусок тела. а потом вдруг ты опять пытаешься отправить заголовки с релокацией. и на это пхп и ругается. и указывает для отладки файл и строку которые инициализировали отправку тела и как следствие где сработала отправка заголовков.
Спасибо за подробное объяснение. А как исправить это. Какой функцией мне сделать перенаправление в случае успеха, при проверке.
ну либо делать через html раз мы его уже выводим. либо НЕ выводить html-содержимое до тех пор пока оно не будет готово. можно через буферизацию вывода или через нормальную архитектуру приложения.
То есть сразу после проверки выводить, то что нужно выводить. Ну это понятно. Но мне так не подойдет. Этот метод я не понял. Где можно про нее прочитать. У меня была такая уже проблема, но я исправлял ее так: в главном файле index.php создавал switch() и case описывал значения и оттуда Location как раз работал.
почему? чем плох редирект через html? при нулевом понимании алгоритмизации это чуть ли не единственный выход из ситуации.
Просто, страница которую я загружаю тоже будет иметь свой изменяющийся слой. Это форма для входа в личный кабинет.
И что? Ну авторизовался человек - показали ему страницу и её же и заминировали правилами перехода. Через рефреш в заголовках, через рефреш в исходнике гипертекста, через джаваскрипт, или просто ссылку дали на нужный элемент. Аж четыре варианта.
То есть у меня к примеру как я написал есть страница Код (PHP): <!doctype html> <html> <head> <title>Личный кабинет для сотрудников ООО "Одеон"</title> <link rel="stylesheet" href="../../style.css" type="text/css"> <meta charset="utf-8"> </head> <?php include($_SERVER['DOCUMENT_ROOT'].'/views/pages/'. $cabinet_select .'.php');?> </html> Первый слой который я загружаю это слой проверки Логина и Пароля Код (PHP): <body> <header> </header> <main> <h2>Вход в личный кабинет для сотрудников ООО "ПК Одеон"</h2> <form action="index.php" method="post" name="login_form"> <p><label for="email">Email:</label> <input type="email" id="email" name="email" value=""><p> <p><label for="password">Пароль:</label> <input type="password" id="password" name="password" value=""><p> <p><input type="submit" name="login_button" value="Войти"></p> </form> </main> <footer> </footer> </body> <?php $submit=$_POST['login_button']; if(isset($submit)) { include($_SERVER['DOCUMENT_ROOT'].'/function/login_manager.php'); } else { echo "Кнопка не нажата"; } ?> А после удачной проверки Логина и Пароля, мне необходимо изменить $cabinet_select c значения по умолчанию index на другое и сделать перезагрузку страницы. Что значит заминировать? Добавлено спустя 12 минут 47 секунд: То есть как я понял, мы из нижнего слоя не можем менять значение вышестоящего ? Как в javascript области видимости. Что то на подобии этого.
после закрытия стакана боди ты продолжаешь выводить страничный контент. откуда такие гении алгоритмизации берутся?