LINUX.ORG.RU

Подскажите, пожалуйста, из-за чего может быть ошибка Warning: Cannot modify header information.

 , ,


0

1

Подскажите, пожалуйста, из-за чего может быть ошибка Warning: Cannot modify header information.

есть кусок кода login.php. в index.php стоит include('login.php');

ругается на установку кук в строчке 34,35 и header 36, хотя тэги <head> и т.д. я вообще перенес в конец файла, никаких выводов Ошибка «Warning: Cannot modify header information - headers already sent by (output started at /home/cp839104/public_html/spscreen.com/index.php:2) in /home/cp839104/public_html/spscreen.com/login.php on line 34»

хотя на локальном сервере (localhost) все работает отлично, а вот на хостинге ругается. (все настройки одинаковые)

login.php

<?php
if (isset($_COOKIE['login']) && isset($_COOKIE['pass'])) {
	$login = $_COOKIE['login']; //присваеваем переменную
	$password = $_COOKIE['pass']; //присваеваем переменную и кодируем её в md5 для безопасности
	$query = mysql_query("SELECT * FROM `users`  WHERE `login`='$login' AND `password`='$password'"); //отправляем запрос на выборку всего содержимого , где поле логин равно переменной $login, а поле password равно переменной $password
	$row = mysql_num_rows($query); // считаем количество рядов результата запроса
	if($row > 0){ //если их больше 0
		echo "Здравствуйте, ".$_COOKIE['login']."!"; // выводим сообщение об удачной авторизации!
	}else{
		setcookie( "login" , "", time() + 3600, "/");
		setcookie( "pass" , "", time() + 3600, "/");
		
		echo "Вы успешно авторизовались!"; // выводим сообщение об удачной авторизации!
		
		header('Location: .');
	}
}else{
if(isset($_POST['submit'])){ //выполняем нижеследующий код, только если нажата кнопка  
if(empty($_POST['login'])){ //если переменная логина пуста или не существует  
echo"Вы не ввели логин"; // выводим сообщение об ошибке  
    }elseif(!preg_match("/[-a-zA-Z0-9]{3,15}/", $_POST['login'])){ //если переменная не соответствует шаблону -a-zA-Z0-9  
echo"Вы неправильно ввели логин"; // выводим сообщение об ошибке      
    }elseif(empty($_POST['password'])){ //если переменная логина пуста или не существует  
echo"Вы не ввели пароль"; // выводим сообщение об ошибке  
    }elseif(!preg_match("/[-a-zA-Z0-9]{3,30}/", $_POST['password'])){ //если переменная не соответствует шаблону -a-zA-Z0-9  
echo"Вы неправильно ввели пароль"; // выводим сообщение об ошибке      
    }else{  
    $login = $_POST['login']; //присваеваем переменную  
    $password = md5($_POST['password']);//присваеваем переменную и кодируем её в md5 для безопасности  
    $query = mysql_query("SELECT * FROM `users`  WHERE `login`='$login' AND `password`='$password'"); //отправляем запрос на выборку всего содержимого , где поле логин равно переменной $login, а поле password равно переменной $password  
    $row = mysql_num_rows($query); // считаем количество рядов результата запроса  
    if($row > 0){ //если их больше 0  
        
        setcookie( "login" , $_POST['login'], time() + 3600,  "/"); // Здесь ругается
        setcookie( "pass" , md5($_POST['password']), time() + 3600, "/");  // Здесь ругается
		header('Location: .'); // Здесь ругается
        }else{  
        echo "Неправильный логин или пароль!"; // выводим сообщение об ошибке!  
        }  
    } 
 }}
if(isset($_POST['exit'])){

	setcookie( "login" , "", time() + 3600, "/");
	setcookie( "pass" , "", time() + 3600, "/");
	
	echo "Выполняем выход";
		
	header('Location: .');
}
?>

<form action="" method="post" enctype="multipart/form-data">
<?php if (isset($_COOKIE['login']) && isset($_COOKIE['pass'])) {
	echo '<input name="exit" type="submit" value="Выйти"><br />';
}else{
	echo 'Логин:<br /><input name="login" type="text" size="20"><br />';
	echo 'Пароль:<br /><input name="password" type="password" size="20"><br />';
	echo '<input name="submit" type="submit" value="Войти">';
	echo '<input name="exit" type="submit" value="Выйти"><br />';
	echo '<a href = "reg.php">Регистрация</a>';
	
}?>
<br />
</form> 

Ответ на: комментарий от emissar

Глянул, в общем, spscreen.com, там выводится хтмл перед установкой кук:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<br />

emissar ★★
()

Из-за поганого спагетти-кода, за который надо отрывать руки и засовывать их в одно место.

VirRaa ★★★
()

Не пиши так, серьезно. Посмотри в сторону фреймворков.

gwinn ★★★★
()
Ответ на: комментарий от VirRaa

весь код (кроме кук) основан на том, что представлял мне интернет и php сообщество, так что вместо подобных фраз, было бы уместней скинуть ссылку на лучшие примеры

Bobrius
() автор топика
Ответ на: комментарий от emissar

эти строки я комментировал, тем не менее, результат все тот же. а вот UTF-8 как раз без BOM, все общие причины устранял, но результат тот же(

Bobrius
() автор топика
Ответ на: комментарий от emissar

спасибо, попробую перепроверить все еще раз

Bobrius
() автор топика

тэги <head>

Ну это совсем не то.

из-за чего может быть ошибка Warning: Cannot modify header information.

Это значит что кто-то пытается отправить заголовки два раза. Наверное это setcookie, которая как раз заголовки и модифицирует.

Скорее всего у тебя где-то до setcookie на экран выводится какой-либо текст, например warning, notice или что-то ещё. При этом сервер отсылает заголовки и дальше их отослать второй раз уже не получится.

Попробуй заменить все setcookie на echo и посмотреть, что вообще тебе выводится.

risenshnobel ★★★
()
Ответ на: комментарий от Bobrius

Вместо колажа из найденного скама в интернете почитай нормальную литературу. На ЛОРе был топик. И, если не ошибаюсь, у тебя sql-injection-решето.

anonymous
()
Ответ на: комментарий от risenshnobel

попробовал, все нормально, даже на localhost все работает отлично и куки записываются, хотя теги head были до setcookie.

Bobrius
() автор топика
Ответ на: комментарий от anonymous

preg_match(«/[-a-zA-Z0-9]{3,30}/»... все решето решается, но вот куки могут и красть, но это не такая проблема, так как пробую только.

На ЛОРе было куча топиков но вот нужного не получилось найти. А вот перечитать все книги по PHP перед тем как попробовать сделать что-нибудь своими руками, это уж слишком, лично я считаю, что опыт приходит на собственных ошибках

Bobrius
() автор топика

задача решена! Результат - моя невнимательность. Дело в том, что в начале index.php было подключение connect_bd.php, которая содержала лишние пробелы. Не знаю почему выходила ошибка, хотя кодировка была utf-9 без DOM, но удаление лишних строк исправило ситуацию. Всем спасибо за помощь. Если критики кода накидают ссылочек на лучшие реализации данной задачи или на умные статьи, буду еще премного благодарен.

Bobrius
() автор топика
Ответ на: комментарий от Bobrius

[-a-zA-Z0-9]{3,30}

Только вот под этот шаблон замечтательно подходит строка типа такой:

aaa'

А под такой уже нет:

^[-a-zA-Z0-9]{3,30}$

Да и логин из кукисов сразу в запрос идет без фильтрации.

emissar ★★
()

Не знаю, что у тебя там решилось, но конкретно эта ошибка возникает из-за использования директивы header после любого вывода (у тебя echo). header() надо делать всегда до. Все места, где у тебя идёт вывод, а затем вызывается header - ошибочны.

В вызов mysql_ функций никто никогда нефильтрованный ввод не подставляет. Используй mysql_real_escape_string для переданных параметров.

И общая стратегия более безопасной проверки логина заключается не в проверке на ненулевой результат кол-ва строк из базы, а на сравнение количества строк строго с единицей.

Дело в том, что в начале index.php было подключение connect_bd.php, которая содержала лишние пробелы. Не знаю почему выходила ошибка

Там у тебя были пустые строки вне <? ?> т.е. формировался вывод, а здесь был вызов header().

Reaper ★★
()
Последнее исправление: Reaper (всего исправлений: 2)
Ответ на: комментарий от Bobrius

весь код (кроме кук) основан на том, что представлял мне интернет и php сообщество, так что вместо подобных фраз, было бы уместней скинуть ссылку на лучшие примеры

Почитай о концепции MVC, просто для развития. Если у тебя какая-то разовая маленькая никому не нужная задачка, то и эта каша имеет право на существование, а если учишься, то надо привыкать разделять работу с данными и формирование вывода. MVC один из способов подобного разделения. В вики в статье об MVC есть пример для PHP, можно быстро представление получить, что это такое.

Reaper ★★
()
Ответ на: комментарий от Reaper

Спасибо интересная статья, буду читать, задачка реально разовая и больше for fun, но знания всегда пригодятся.

Bobrius
() автор топика
Ответ на: комментарий от Reaper

много чего было уже изменено, и echo убраны, но ошибки продолжали выпадать.

До сих пор не могу понять почему в локальной сети на разных серверах все это хорошо работало и продолжает работать старый код, хотя заведомо присутствуют ошибки.

Bobrius
() автор топика
Ответ на: комментарий от anonymous

так достаточно в переменных запретить пробелы и инжекция не пройдет. Но статья все равно интересная, спасибо, в закладки положил)

Bobrius
() автор топика

у тебя в коде дырища

тебе рано на хостинг - подними виртуалку не пиши так - оформи код аккуратно, или убери форматирование вообще - разницы никакой

поизучи протокол http... поиграйся с ним в телнете или неткате или curl - для начала делай запросы ручками, попробуй научит5ся выставлять куки сам...

если сложно зпт возьми пример с мануала пхп и пробуй его и почитай мануалы на сайте пхп про куки для начала

anonymous
()

из за того что сначала выводиться заголовок а потом тело страницы, а такая ошибка возникает когда ты пытаешься после тела страницы вывести заголовок

anonymous
()
Ответ на: комментарий от anonymous

дело в том и есть, что на виртуалках (а точнее я запускал на локальном сервере) все работает на ура, без возникновения этой ошибки.

а какая разница рано на хостинг или не рано, я for fun делал, интернет от этого сильно тупее не стал

Bobrius
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.