Здравствуйте. Такая проблема: пытаюсь написать авторизацию... При попытке залогинится вылазит Warning: Cannot modify header information - headers already sent by (output started at Z:\home\site.ru\www\index.php:15) in Z:\home\site.ru\www\modules\mod_login.php on line 77 Я понимаю что устанавливать куки можно до любого вывода в браузер. Если ставлю инклуд модуля авторизации перед всем кодом хтмл, то все работает... Но тогда получается соответсвенно что форма авторизации над всей страницей( Вопрос: Как вписать форму, что бы она ставила куки, после кода(что бы можно было ее встроить в дизайн) З.Ы. На 15 строке <a href="/"><div class="logo"></div></a>(не пойму почему затык именно на ней, ведь раньше нее тоже идут строки например "<div class="top">") На 77 строке setcookie("user",$mdname,time()+60*60*24*10,"/"); Зараннее спасибо.
Проверка авторизации с куками обязана быть в начале. А форму можно вывести в любом месте по условию, пройдена ли авторизация. Если умеете создавать переменные, то знаете, как. А что за "затык" в строке 15, что это значит? Есть другое понятие - не валидно. В теге a не должно быть вложенных блочных элементов типа div, p, h1 и т.п.
Куки устанавливаются при условии что логин и пароль верны. У меня форма авторизации и вся логика работы в одном файле, поетому все как б происходит в одном месте. Может я не так чего то делаю? Подскажите направление, буду блгодарен.. Затык, имеется ввиду что ругается конкретно на 15 ую строку... Я понимаю что там не валидно, ето просто для теста сделанно... Вопрос в том, что до вывода <a href="/"><div class="logo"></div></a> идет вывод других тегов, и на них как раз скрипт не обращает внимания... Но это не главное... Для меня главное понять как интегрировать форму в дизайн, и при этом сохранить весь функционал...
В форме пишется логин и пароль, отсылается, принимается той же страницей. Потом проверка юзера в бд, потом создание и отправка куки, если юзер найден. Тут же создание переменной, по которой ориентироваться, выводить ли ещё какую-то форму, или не выводить. Потом уже вывод страницы.
YSandro Так все и происходит... Вот куски кода: начало index.php Код (Text): <? include('conf.php'); ?> <!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> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <link href="style/style.css" rel="stylesheet" type="text/css" /> </head> <body> <div class="top"> <a href="/"><div class="logo"></div></a> <div class="top_menu"> <ul id="main-menu"> <li id="about" class="menu-li">Линк1</li> <li id="how" class="menu-li">Линк2</li> <li id="autors" class="menu-li">Линк3</li> <li id="koshik" class="menu-li">Линк4</li> </ul> </div> <? include('modules/mod_login.php'); ?> Кусок файла mod_login.php там где проверка правильности уже прошла и нада установить куки Код (Text): else { $AuthForma = false; - переменная которая отвечает за вывод формы регистрации $mdname = md5($row->login); $query= "UPDATE users SET session='$mdname' WHERE `id` = '$row->id'"; mysql_query($query) or die(mysql_error()); $tmp=$row->login; $_SESSION["UserInfo"] = array('login'=>$tmp,'email'=>$row->mail); setcookie("user",$mdname,time()+60*60*24*10,"/"); } Добавлено спустя 1 минуту 22 секунды: Your Все точно, я все файлы создаю изначально в notepad++ и ставлю там утф8 без бом
должно быть как-то так. псевдокод: есть кука с id пользователя и хещем и они проходят проверку? { ..пользователь = взять из базы по id } иначе { ..пользователь = "гость" } пользователь == "гость"? { ..мы получили запрос POST и определены поля login и password? { ....это правильные login и password? { ......сохраняем в куку id пользователя и хеш пароля. немедленно редиректимся на себя ....} иначе { ......выводим айайай! ....} ..} } пользователь == "гость"? { ..выводим форму для ввода login & password } выводим всё остальное т.е. любой вывод ПОСЛЕ записи в куки
artoodetoo, надо бы написать класс, который по этому псевдокоду будет писать конкретный код, небольшой ИИ. ТС говорит, что у него так всё и происходит, только не работает
artoodetoo Дак модуль авторизации примерно так все и делает, проблема в том, что инклудистя он в index.php в нужном мне месте, и соответсвенно до инклуда уже есть теги... вот полный листинг файла mod_login.php Код (Text): <? @$login=$_POST['login']; @$pass=$_POST['password']; if (isset($_POST['sbm2'])) { if(!empty($_COOKIE["user"])) { setcookie("user","",time()-60,"/"); session_start(); $_SESSION = array(); session_destroy(); // header('URL=index.php'); } //header("Location: index.php"); } if(empty($_COOKIE["user"]) && isset($_POST['slogin'])) { $query = "SELECT * FROM users WHERE login='". $login ."'"; $result = mysql_query($query)or die("<h3>" . mysql_error() . "</h3>"); if(mysql_num_rows($result) == 0) {//header('Refresh: 3; URL=index.php'); echo('<div style="background:#CEE0CA; width:460px; margin: 0 auto; color:#3C3937; font-size=16px; font-weight:bold;padding:20px; border:1px solid; text-align:center;">'); echo('<p class="er1">Логин не верный.</p>'); $AuthForma = true; echo('</div>'); exit; } else { $query = "SELECT * FROM users WHERE name='". $login ."'"; while($row = mysql_fetch_object($result)) if($row->password != md5($pass)) { //echo('<div style="background:#CEE0CA; width:460px; margin: 0 auto; color:#3C3937; font-size=16px; font-weight:bold;padding:20px; border:1px solid;">'); // echo('<p class="er1">Пароль не верный!</p>'); $AuthForma = true; echo('</div>'); exit; } elseif($row->active != 'true') { echo('<div style="background:#CEE0CA; width:460px; margin: 0 auto; color:#3C3937; font-size=16px; font-weight:bold;padding:20px; border:1px solid; text-align:center;">'); echo('<p class="er1">Вы успешно зарегистрировались на нашем сайте,но не активировали свой аккаунт!</p>'); $AuthForma = true; echo('</div>'); exit; } else { $AuthForma = false; $mdname = md5($row->login); $query= "UPDATE users SET session='$mdname' WHERE `id` = '$row->id'"; mysql_query($query) or die(mysql_error()); $_SESSION["UserInfo"] = array('login'=>$tmp,'email'=>$row->mail); setcookie("user",$mdname,time()+60*60*24*10,"/"); } } } if(empty($_COOKIE["user"])) { @$AuthForma = true; } if(@$AuthForma == true) { echo(' <div class="login"> <form name="FormLogin" method="POST" enctype="application/x-www-form-urlencoded"> <table style="margin-right:10px;padding-right:10px;"><tr><td> Логин</td><td> <input type="text" name="login" size=25 /> </td> <tr><td> Пароль</td><td> <input type="text" name="password" size=25 /> </td> </tr> </table> <div style="float:left;"><input type="submit" name="slogin" value="Войти" style="width:100px;height:30px;" /></div></form> <input type="submit" name="reg" value="Регистрация" style="width:100px;height:30px;" /></p> </div> '); } else { echo('<div class="postlogin"><table style="padding-left:200px;"><tr><td style="color:#fff;font-weight:bold;">Welcome!'); echo('<form name="exitf" method="post"><span style="margin-right:10px;"></span><input type="submit" name="sbm2" value="Выйти"></form></div>');} ?> Теперь ругается на строчку 12 там: <div class="top_menu"> Получается что теги которые идут раньше он кушает, а на етом давится...
Если инклудится не в начале, и до инклуда есть теги, то модуль работает совсем не так, как вам объясняют.
это нормально. на хостинге как правило отключен вывод ошибок и предупреждений. (это не значит, что их не стало) Добавлено спустя 2 минуты 14 секунд: Код (PHP): error_reporting(-1); ini_set('display_errors', 'on'); если поставите эти строки в самое начало скрипта, на хостинге также будут сообщения. но я бы не советовал. текст ошибок помогает хакерам ломать дырявые сайты.