1

Данная проблема возникает при авторизации (работают сессии).

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\bbb\www\aaa.php:59) in Z:\home\bbb\www\module.php on line 100

Warning: Cannot modify header information - headers already sent by (output started at Z:\home\bbb\www\aaa.php:59) in Z:\home\bbb\www\module.php on line 101

Авторизация проходит. Но перед выводом - Привет, user - пишутся данные сообщения. Читал, что возможно это связано с проблеами до <?php и после ?>. Но вроде как никаких пробелов в коде не присутствует. Кроме того - это может быть связано с кодировкой. Все файлы должны быть сохранены в UTF 8 без Bom. Все так и сделано. Но все равно появляются данные сообщения. Прошу помочь) Вот код странички, на которой выводится - Привет, user.

<?php
include_once 'conf.php';

$auth = new auth(); //~ Создаем новый объект класса

//~ Авторизация if (isset($_POST['send'])) { if (!$auth->authorization()) { $error = $_SESSION['error']; unset ($_SESSION['error']); } }

//~ выход if (isset($_GET['exit'])) $auth->exit_user();

?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

<head>

    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;

    &lt;script type="text/javascript" src="/resources/js/jquery-1.10.2.min.js"&gt;&lt;/script&gt;

    &lt;script type="text/javascript" src="login_panel/js/pngfix/supersleight-min.js"&gt;&lt;/script&gt;

</head>

<body>

<!-- Panel --> <div id="toppanel"> <div id="panel"> <div class="content clearfix"> <?php if(!$_SESSION['id_user']): ?>

        &lt;div class="left"&gt;
            &lt;!-- Login Form --&gt;

                &lt;h1&gt;Войти на сайт&lt;/h1&gt;
&lt;?php
                $k='';

                $auth = new auth(); //~ Создаем новый объект класса

        $k.='
            &lt;form action="" method="post"&gt;
                &lt;label class="grey" for="login"&gt;Логин:&lt;/label&gt;
                &lt;input class="field" type="text" name="login" value="'.@$_POST['login'].'" size="23" /&gt;
                &lt;label class="grey" for="passwd"&gt;Пароль:&lt;/label&gt;
                &lt;input class="field" type="password" name="passwd" id="" size="23" /&gt;
                &lt;input type="submit" value="send" name="send" /&gt;
            &lt;/form&gt;
        ';
        print $k;
?&gt;
        &lt;/div&gt;
        &lt;div class="left right"&gt;            
            &lt;!-- Register Form --&gt;
                &lt;h1&gt;Регистрация&lt;/h1&gt;                  
&lt;?php
                $reg = new auth(); //~ Создаем новый объект класса

                $form = '

                &lt;form action="" method="post"&gt;
                &lt;label class="grey" for="login"&gt;Логин:&lt;/label&gt;
                &lt;input class="field" type="text" name="login" id="" value="'.@$_POST['login'].'" size="23" /&gt;
                &lt;label class="grey" for="passwd"&gt;Пароль:&lt;/label&gt;
                &lt;input class="field" type="password" name="passwd" id="" size="23" /&gt;
                &lt;label class="grey" for="passwd2"&gt;Повторите Пароль:&lt;/label&gt;
                &lt;input class="field" type="password" name="passwd2" id="" size="23" /&gt;
                &lt;label class="grey" for="mail"&gt;E-mail:&lt;/label&gt;
                &lt;input class="field" type="text" name="mail" value="'.@$_POST['mail'].'" size="23" /&gt;
                &lt;input type="submit" value="send" name="send" /&gt;
                &lt;/form&gt;';
    if (isset($_POST['send'])) {
    if ($reg-&gt;reg($_POST['login'], $_POST['passwd'], $_POST['passwd2'], $_POST['mail'])) {
    print '
        &lt;h2&gt;Регистрация успешна.&lt;/h2&gt;
        Вы можете войти. 
    ';
    } else print $form;
    } else print $form;
?&gt;
        &lt;/div&gt;
&lt;?php   
        else:   
?&gt;
        &lt;div class="left"&gt;

        &lt;h1&gt;Вы вошли на сайт&lt;/h1&gt;
        &lt;a href="?exit"&gt;Выйти&lt;/a&gt;

        &lt;/div&gt;

        &lt;div class="left right"&gt;
        &lt;/div&gt;
&lt;?php   
        endif;  
?&gt;
    &lt;/div&gt;
&lt;/div&gt; &lt;!-- /login --&gt;

&lt;!-- The tab on top --&gt; 
&lt;div class="tab"&gt;
    &lt;ul class="login"&gt;
        &lt;li class="left"&gt;&amp;nbsp;&lt;/li&gt;
        &lt;li&gt;&lt;?php if ($auth-&gt;check()) $r.='Привет, '.$_SESSION['login_user'].'';
        else {
$r.='Привет, Гость';}

print $r;?>!</li> <li id="toggle"> <a id="open" class="open" href="#"><?php echo $_SESSION['id_user']?'Открыть панель':'Войти на сайт';?></a> <a id="close" style="display: none;" class="close" href="#">Закрыть панель</a>
</li> <li class="right">&nbsp;</li> </ul> </div> <!-- / top -->

</div> <!--panel -->

Сам файл conf.php:

<?php
//~ Старт сессии, файл должен быть сохранен без DOM информации
session_start();

include_once 'module.php';

//~ Параметры потключения к бд $db_host = 'localhost'; $db_login = 'root'; $db_passwd = ''; $db_name = 'login';

// подключаемся к бд $db = new mysql(); //~ Создаем новый объект класса $db -> connect($db_host, $db_login, $db_passwd, $db_name); ?>

И тот самый module.php:

function check() {
    if (isset($_SESSION['id_user']) and isset($_SESSION['login_user'])) return true;
    else {
        //~ проверяем наличие кук
        if (isset($_COOKIE['id_user']) and isset($_COOKIE['code_user'])) {
            //~ куки есть - сверяем с таблицей сессий
            $db = new mysql(); //~ создаем новый объект класса
            $id_user=$db->screening($_COOKIE['id_user']);
            $code_user=$db->screening($_COOKIE['code_user']);
            if ($db->query("SELECT * FROM `session` WHERE `id_user`=".$id_user.";", 'num_row', '')==1) {
                //~ Есть запись в таблице сессий, сверяем данные
                $data = $db->query("SELECT * FROM `session` WHERE `id_user`=".$id_user.";", 'accos', '');
                if ($data['code_sess']==$code_user and $data['user_agent_sess']==$_SERVER['HTTP_USER_AGENT']) {
                    //~ Данные верны, стартуем сессию
                    $_SESSION['id_user']=$id_user;
                    $_SESSION['login_user']=$db->query("SELECT login_user FROM `users` WHERE  `id_user` = '".$id_user."';", 'result', 0);
                    //~ обновляем куки
                    setcookie("id_user", $_SESSION['id_user'], time()+3600*24*14);
                    setcookie("code_user", $code_user, time()+3600*24*14);
                    return true;
                } else return false; //~ данные в таблице сессий не совпадают с куками
            } else return false; //~ в таблице сессий не найден такой пользователь
        } else return false;
    }
}

Строчки 100 и 101 в headers:

setcookie("id_user", $_SESSION['id_user'], time()+3600*24*14);
setcookie("code_user", $code_user, time()+3600*24*14);
Deleted
  • 371
Nabla
  • 101
  • зачем вам вообще эти данные в куках ? храните из в сессиях – zb' Feb 03 '14 at 19:05
  • нужны куки - так как удобно не вводить по тысячи раз логин и пароль. один раз ввел. браузер запомнил и все. автоматически все работает. а на сессиях - приходится постоянно подтверждать свой логин и пароль. – Nabla Feb 03 '14 at 19:18

1 Answers1

2

Чудес не бывает. У вас вызывается в коде функция check(), где проставляются куки, при этом уже куча HTML была выведена. Мало подключить все это дело до вывода чего-либо в браузер, все это нужно и использовать ДО вывода чего-либо в браузер.

<?php
include_once 'conf.php';

$auth = new auth(); //~ Создаем новый объект класса

//~ Авторизация if (isset($_POST['send'])) { if (!$auth->authorization()) { $error = $_SESSION['error']; unset ($_SESSION['error']); } }

//~ выход if (isset($_GET['exit'])) $auth->exit_user();

$isAuth = $auth->check(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> </head> <body> ... <li><?php if ($isAuth) $r.='Привет, '.$_SESSION['login_user'].''; else { $r.='Привет, Гость';} print $r;?>!</li>...

aldem67
  • 1,465
  • вот до этого //~ выход сделайте проверку на авторизацию, т.е. до начала вывода страницы. результат запомните в переменную какую-нибудь, например $isAuth и уже ее проверяйте, а не вызывая функцию. – aldem67 Feb 03 '14 at 19:25
  • чтобы ничего не менять посмотрите в сторону Ob_Start() Должно помочь... – jackrv Feb 03 '14 at 19:27
  • 1
    можно и ob_* использовать. Дополнил ответ упрощенным кодом, по переносу результата в переменную. – aldem67 Feb 03 '14 at 19:28
  • Вроде все заработало) Спасибо! Я авторизацию на куках проверяю на всех браузерах. Однако - почему-то в Safari и Firefox нет автоматического входа...Не подскажите. с чем это может быть связано? – Nabla Feb 03 '14 at 19:40
  • К сожалению, не могу сейчас подсказать. Может там стоит запрет на сохранение кук, может какие-то другие настройки браузера. – aldem67 Feb 03 '14 at 19:44
  • А это может быть связано с тем, что для того, чтобы сработали куки - нужно хотя бы сессию отсидеть в браузере? – Nabla Feb 03 '14 at 19:48