За последние 24 часа нас посетили 34504 программиста и 1752 робота. Сейчас ищут 966 программистов ...

авторизация

Тема в разделе "PHP для новичков", создана пользователем produser, 18 апр 2012.

  1. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    Здравствуйте. Такая проблема: пытаюсь написать авторизацию... При попытке залогинится вылазит


    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,"/");

    Зараннее спасибо.
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Проверка авторизации с куками обязана быть в начале. А форму можно вывести в любом месте по условию, пройдена ли авторизация. Если умеете создавать переменные, то знаете, как.
    А что за "затык" в строке 15, что это значит? Есть другое понятие - не валидно. В теге a не должно быть вложенных блочных элементов типа div, p, h1 и т.п.
     
  3. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    Куки устанавливаются при условии что логин и пароль верны. У меня форма авторизации и вся логика работы в одном файле, поетому все как б происходит в одном месте. Может я не так чего то делаю? Подскажите направление, буду блгодарен..

    Затык, имеется ввиду что ругается конкретно на 15 ую строку... Я понимаю что там не валидно, ето просто для теста сделанно... Вопрос в том, что до вывода <a href="/"><div class="logo"></div></a> идет вывод других тегов, и на них как раз скрипт не обращает внимания...

    Но это не главное... Для меня главное понять как интегрировать форму в дизайн, и при этом сохранить весь функционал...
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  5. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    В форме пишется логин и пароль, отсылается, принимается той же страницей. Потом проверка юзера в бд, потом создание и отправка куки, если юзер найден. Тут же создание переменной, по которой ориентироваться, выводить ли ещё какую-то форму, или не выводить. Потом уже вывод страницы.
     
  6. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    Your

    Такая и стоит.
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    index.php

    mod_login.php

    Оба ??? Точно не просто UTF 8 ?
     
  8. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    YSandro

    Так все и происходит...

    Вот куски кода:
    начало index.php
    Код (Text):
    1.  
    2. <? include('conf.php'); ?>
    3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    4. <html xmlns="http://www.w3.org/1999/xhtml">
    5. <head>
    6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    7. <title></title>
    8. <link href="style/style.css" rel="stylesheet" type="text/css" />
    9. </head>
    10.  
    11. <body>
    12.  
    13. <div class="top">
    14.  
    15.   <a href="/"><div class="logo"></div></a>
    16.   <div class="top_menu">
    17.     <ul id="main-menu">
    18.       <li id="about" class="menu-li">Линк1</li>
    19.       <li id="how" class="menu-li">Линк2</li>
    20.       <li id="autors" class="menu-li">Линк3</li>
    21.       <li id="koshik" class="menu-li">Линк4</li>
    22.     </ul>
    23.   </div>
    24.     <? include('modules/mod_login.php');
    25. ?>
    Кусок файла mod_login.php там где проверка правильности уже прошла и нада установить куки

    Код (Text):
    1.  
    2.         else
    3.             {
    4.                 $AuthForma = false; - переменная которая отвечает за вывод формы регистрации
    5.                 $mdname = md5($row->login);
    6.                                 $query= "UPDATE users SET session='$mdname' WHERE `id` = '$row->id'";
    7.                                 mysql_query($query) or die(mysql_error());
    8.                                 $tmp=$row->login;
    9.                 $_SESSION["UserInfo"] = array('login'=>$tmp,'email'=>$row->mail);
    10.                 setcookie("user",$mdname,time()+60*60*24*10,"/");
    11.             }
    Добавлено спустя 1 минуту 22 секунды:
    Your

    Все точно, я все файлы создаю изначально в notepad++ и ставлю там утф8 без бом
     
  9. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    должно быть как-то так. псевдокод:

    есть кука с id пользователя и хещем и они проходят проверку? {
    ..пользователь = взять из базы по id
    } иначе {
    ..пользователь = "гость"
    }
    пользователь == "гость"? {
    ..мы получили запрос POST и определены поля login и password? {
    ....это правильные login и password? {
    ......сохраняем в куку id пользователя и хеш пароля. немедленно редиректимся на себя
    ....} иначе {
    ......выводим айайай!
    ....}
    ..}
    }
    пользователь == "гость"? {
    ..выводим форму для ввода login & password
    }
    выводим всё остальное

    т.е. любой вывод ПОСЛЕ записи в куки
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    artoodetoo, надо бы написать класс, который по этому псевдокоду будет писать конкретный код, небольшой ИИ.
    ТС говорит, что у него так всё и происходит, только не работает :)
     
  11. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    artoodetoo

    Дак модуль авторизации примерно так все и делает, проблема в том, что инклудистя он в index.php в нужном мне месте, и соответсвенно до инклуда уже есть теги...

    вот полный листинг файла mod_login.php

    Код (Text):
    1.  
    2. <?
    3.  
    4. @$login=$_POST['login'];
    5. @$pass=$_POST['password'];
    6. if (isset($_POST['sbm2'])) {
    7.    
    8. if(!empty($_COOKIE["user"]))
    9. {
    10.     setcookie("user","",time()-60,"/");
    11.     session_start();
    12.     $_SESSION = array();
    13.     session_destroy();
    14.        // header('URL=index.php');
    15. }
    16. //header("Location: index.php");
    17. }
    18.  
    19.  
    20.  
    21. if(empty($_COOKIE["user"]) && isset($_POST['slogin']))
    22.  
    23. {
    24.    $query = "SELECT * FROM users WHERE login='". $login ."'";
    25.    $result = mysql_query($query)or die("<h3>" . mysql_error() . "</h3>");
    26.      if(mysql_num_rows($result) == 0)
    27.     {//header('Refresh: 3; URL=index.php');
    28.                 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;">');
    29.         echo('<p class="er1">Логин не верный.</p>');
    30.         $AuthForma = true;
    31.                 echo('</div>');
    32.                 exit;
    33.     }
    34.      else
    35.         {
    36.                 $query = "SELECT * FROM users WHERE name='". $login ."'";
    37.                 while($row = mysql_fetch_object($result))
    38.                 if($row->password != md5($pass))
    39.             {
    40.                            //echo('<div style="background:#CEE0CA; width:460px; margin: 0 auto; color:#3C3937; font-size=16px; font-weight:bold;padding:20px; border:1px solid;">');
    41.                          //  echo('<p class="er1">Пароль не верный!</p>');
    42.                            $AuthForma = true;
    43.                            echo('</div>');
    44.                            exit;
    45.                         }
    46.                 elseif($row->active != 'true')
    47.             {
    48.                            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;">');
    49.                            echo('<p class="er1">Вы успешно зарегистрировались на нашем сайте,но не активировали свой аккаунт!</p>');
    50.                            $AuthForma = true;
    51.                            echo('</div>');
    52.                            exit;
    53.             }
    54.         else
    55.             {
    56.                 $AuthForma = false;
    57.                 $mdname = md5($row->login);
    58.                 $query= "UPDATE users SET session='$mdname' WHERE `id` = '$row->id'";
    59.                 mysql_query($query) or die(mysql_error());
    60.                 $_SESSION["UserInfo"] = array('login'=>$tmp,'email'=>$row->mail);
    61.                 setcookie("user",$mdname,time()+60*60*24*10,"/");
    62.             }
    63.         }
    64. }
    65. if(empty($_COOKIE["user"]))
    66. {
    67.     @$AuthForma = true;
    68. }
    69. if(@$AuthForma == true)
    70. {
    71.   echo('
    72.   <div class="login">
    73.     <form name="FormLogin" method="POST" enctype="application/x-www-form-urlencoded">
    74.     <table style="margin-right:10px;padding-right:10px;"><tr><td>
    75.     Логин</td><td>
    76.     <input type="text" name="login" size=25 />
    77.     </td>
    78.     <tr><td>
    79.     Пароль</td><td>
    80.     <input type="text" name="password" size=25 />
    81.     </td>
    82.     </tr>
    83.     </table>
    84.     <div style="float:left;"><input type="submit" name="slogin" value="Войти" style="width:100px;height:30px;" /></div></form>
    85.     <input type="submit" name="reg" value="Регистрация" style="width:100px;height:30px;" /></p>
    86.     </div>
    87. ');
    88. } else { echo('<div class="postlogin"><table style="padding-left:200px;"><tr><td style="color:#fff;font-weight:bold;">Welcome!');
    89. echo('<form name="exitf" method="post"><span style="margin-right:10px;"></span><input type="submit" name="sbm2" value="Выйти"></form></div>');}
    90. ?>
    Теперь ругается на строчку 12 там:

    <div class="top_menu">

    Получается что теги которые идут раньше он кушает, а на етом давится...
     
  12. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Если инклудится не в начале, и до инклуда есть теги, то модуль работает совсем не так, как вам объясняют.
     
  13. produser

    produser Активный пользователь

    С нами с:
    21 янв 2012
    Сообщения:
    61
    Симпатии:
    0
    Залил на хост , там все работает, на локалхосте нет... код 1 в 1... Аномалия какая то(
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    это нормально. на хостинге как правило отключен вывод ошибок и предупреждений. (это не значит, что их не стало)

    Добавлено спустя 2 минуты 14 секунд:
    Код (PHP):
    1. ini_set('display_errors', 'on');
    2.  
    если поставите эти строки в самое начало скрипта, на хостинге также будут сообщения. но я бы не советовал. текст ошибок помогает хакерам ломать дырявые сайты.