@whiteleaf

Как правильно структурировать документ, чтобы избежать «Cannot modify header information — headers already sent by»?

Всем здравствуйте,
Сражу же извиняюсь за столько детские вопросы, но я только начинаю изучать программирование и столкнулся с авторизацией, а именно с header(). Я знаю, что header'сы должны предшествовать всем выводам, но будет тогда правильней структурировать структуру, чтобы избежать их?

Приведу исходники ниже:

index.php
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Blog</title>
	<link rel="stylesheet" href="css/style.css">
</head>
<body>
	<div class="container">
		<div class="top"><?php (isset($_POST['session_id'])) ? include_once "logout.php" : include_once "lgn.php"; ?></div>
		<div class="center">
			<div class="left">left</div>
			<div class="content"><?php include_once "blog.php"; ?></div>
		</div>
	</div>
</body>
</html>


lgn.php

<?php 
		$login 		= htmlentities(trim($_POST['login']));
		$password 	= md5(trim($_POST['password']));
			if (isset($_POST['submit'])) {
				include_once "db_connect.php";
				include_once "config.php";
				if (isset($login,$password)) {
				$query = "SELECT * FROM users WHERE login="."'".$login."'";
				$result = mysqli_query($con,$query);
				$user = array();
				while ($row = mysqli_fetch_array($result)) {
					foreach ($row as $key => $value) {
						if (!is_numeric($key)) {
							$user[$key] = $value;
						}
					}
				}
				if (($login === $user['login']) && ($password === $user['password'])) {
					setcookie('session_id', $user['id']);
					setcookie('login', $user['login']);
				}else{
					echo "Such user doen't exist or login/password dosn't match. Please, check them twice and try again!";
				}
			}
		}
 	?>
<div class="login">
	<form action="" method="POST">
		<table>
			<tr>
				<td><input type="text" name="login" placeholder="Login" value="<?php echo $_POST['login'] ?>"></td>
				<td><input type="password" name="password" placeholder="Password"></td>
				<td><input type="submit" name="submit"></td>
			</tr>
		</table>
	</form>			
</div>


logout.php
<table>
	<tr>
		<td><?php echo "Welcome back, ".$_COOKIE['login']; ?></td>
		<td><a href="<?php setcookie('session_id', ""); ?>">Log out</a></td>
	</tr>
</table>
  • Вопрос задан
  • 2759 просмотров
Решения вопроса 3
LIAL
@LIAL
index.php у вас есть фактически хтмл шаблон. организуйте его примерно так:
<?php
 if (проверка данных выводить шаблон или заглолвки отправлять) {
    что-то можно сделать тут еще. но только не echo,print или вывод какой либо
     тут можете посылать ваши хидеры (session, cookie И так далее)
  else {
  тут выводите ваш html типа echo '<html>........</html>';
}
?>


и еще проверьте на всякий случай кодировку файла. в свое время очень долго намучался с такой ошибкой когда файл был сохранен как utf8 with BOM, надо БЕЗ ВОМ. Тк этот бом добавляет вывод каких то служебных стмволов вначале файла, что приводит к трму что до посылки заголовков в output уже были отправлены данные

ps: сильно упрощенно но суть должна быть понятна
Ответ написан
zenaku
@zenaku
Еще пару важных замечаний:
1. php код должен начинаться с самой первой строчки документа
Правильно:
1 <?php
2 header('...');
...

Неправильно:
1 
2 <?php
3 header('...');
...

Это связано с тем, что пустая строка будет уже выводится, а следовательно и заголовки будут отправлены
2. Смотрите то, что инклюдите. Если том будет первая пустая строка или будет производится вывод - заголовки отправятся.
3. Если файлы инклюда состоят только из php, то не используйте ?>
Правильно:
1 <?php
2 header('...');
...   ...
455 $a = 4;
456
457
---------------
конец документа

Неправильно:
1 <?php
2 header('...');
...   ...
455 $a = 4;
456 ?>
457
---------------
конец документа

Причина в том, что после ?> может быть символы, а значит будет отправлена строка

И вообще, старайтесь структурировать данные так, чтобы было ясно что и где. А лучше вообще html отдельно от php
Ответ написан
ob_start()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы