Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Авторизация на сайте


Автор: MrDmitry 14.12.2013, 20:58
сделал авторизацию на куках

index.php
Код

header ('Content-Type: text/html; charset=UTF-8');
include 'system.php';


    if(isset($_GET['logout']))
     {
      setcookie('DataBase', "", time()-3600);
      setcookie('user', "", time()-3600);
      header('Location: /');
     }
    
     if(isset($_POST['login']))
      {
       if(check_login($db, $key, $_POST['login'], $_POST['pass']))
        { 
         echo start();
         include 'scheme.php';
        }
       else
        {
         $err = 'Не верный логин или пароль';
         echo start();
         include 'auth.php';
        } 
      }
     else if(isset($_COOKIE['DataBase']) and !empty($_COOKIE['DataBase']))
      {
       echo start();
       include 'scheme.php';
      }
      else
      {
       if (!empty($_COOKIE['DataBase']))
        {
         echo start();
         include 'scheme.php';
        }
      else
       {
         echo start(); 
         include 'auth.php';
       }
     }


auth.php
Код

<div class="auth">            
  <div class="welcome">Форма авторизации       
  </div>            
  <form action="/" method="post">               
    <center>          
      <span class="info_login"> Логин:            
      </span>          
      <input type="text" name="login" id="login" />                 
      <span class="info_pas"> Пароль:            
      </span>          
      <input type="password" name="pass" id="password" />                 
      <input type="hidden" name="login_add" value="login_add" /><br />                 
      <input type="submit" id="button" name="Submit" value="Вход" /><br />                 
      <span class="error">            
        <?=$err?>          
      </span>        
    </center>   
</div>
  

Код


$key='';//Секретный ключ!!


// База
$mysql_connection_host = "localhost";
$mysql_connection_base = "base";
$mysql_connection_user = "root";
$mysql_connection_password = "";

try {  

  $db = new PDO("mysql:host=$mysql_connection_host;dbname=$mysql_connection_base", $mysql_connection_user, $mysql_connection_password);  
}  
catch(PDOException $e) {  
    echo $e->getMessage();  
}


function check_login($db, $key, $login, $password){

 $sql = $db->prepare('SELECT count(*) as count, login, password FROM user WHERE login=:login');
       $sql->bindParam(':login', $login, PDO::PARAM_STR);
       $sql->execute();
       
       list($count, $user, $password_real) = $sql->fetch(PDO::FETCH_NUM);
        if ($count==0)
            return false;
        else
        {
         if ($password_real == md5($key.$password.$key) and $user==$login)
          {
           //$_COOKIE['DataBase'] = base64_encode($user.'|'.$password_real);
            setcookie('user', base64_encode($user), time()+3600);
           setcookie('DataBase', base64_encode($user.'|'.$password_real), time()+3600);
           return true;
          }
          else
           return false;
        }
}




sheme.php
Код

<div class="top"><span class="date"><?=date( "d.m.y" )?></span> <span class="time" id="time"></span> <span class="logout">
Вы вошли как:<a href="#" class="js__p_user_start"><?=base64_decode($_COOKIE['user'])?></a><div class="form"><form action="?logout=<?=md5($_COOKIE['user'])?>"
 method="post"><input type="submit" id="button" name="Submit" value="Выход" /></form></div></span></div>



В общем проблема в том что после операции входа, для того чтоб появилось имя авторизовавшегося пользователя нужно нажать кнопу обновления браузера (((

Автор: bars80080 14.12.2013, 21:23
ещё один хороший пример, который демонстрирует, что надо отделять обработку от выдачи данных


адекватный код должен иметь такую структуру:

1. приём данных
(из кук или POST из формы - не важно)
2. обработка и поиск в БД
3. принятие решение - условие (if) авторизовался пользователь или нет
3а. если нет - то показать форму авторизации с теми значениями, которые ввёл
3б. если да - то перезагрузить страницу header('Location: ...');

соответственно, с начала программы и до самого header в коде не должно быть ни одного echo или print, или любого символа между тэгами ?> <?php - даже пробела

Автор: MrDmitry 14.12.2013, 21:53
Цитата(bars80080 @ 14.12.2013,  21:23)
ещё один хороший пример, который демонстрирует, что надо отделять обработку от выдачи данных


адекватный код должен иметь такую структуру:

1. приём данных
(из кук или POST из формы - не важно)
2. обработка и поиск в БД
3. принятие решение - условие (if) авторизовался пользователь или нет
3а. если нет - то показать форму авторизации с теми значениями, которые ввёл
3б. если да - то перезагрузить страницу header('Location: ...');

соответственно, с начала программы и до самого header в коде не должно быть ни одного echo или print, или любого символа между тэгами ?> <?php - даже пробела

Ну а собственно как сделано у меня? 

1. Проверка отправлена форма или нет
2. если форма отправлена то поиск данных в БД
3. принятие решение - условие (if) авторизовался пользователь или нет
3а. если нет то выводится по инклуду форма авторизации
3б. Если авторизовался то выводится по инклуду основная страница сайта
4. Если пользователь был авторизован раннее то его перекидывает на основную страницу а не на форму авторизации

Автор: baldina 14.12.2013, 22:57
Цитата(MrDmitry @  14.12.2013,  21:53 Найти цитируемый пост)
Ну а собственно как сделано у меня? 

ну значит у вас все правильно, и проблемы нет  smile 

Автор: MrDmitry 14.12.2013, 23:13
Проблема есть  smile  Я говорю что вроде как логика правильная(по крайней мере я так думаю) но проблема есть  

Автор: SlipKnot 15.12.2013, 15:17
Цитата(MrDmitry @  14.12.2013,  20:58 Найти цитируемый пост)
В общем проблема в том что после операции входа, для того чтоб появилось имя авторизовавшегося пользователя нужно нажать кнопу обновления браузера (((

для того чтоб кука выводилась на экран, послее ее установки нужно сделать редирект на этот же скрипт т.е
Код

if(!isset($_COOKIE['name']))
{
    setcookie('name','Vasya');
}

echo 'My name is: '.$_COOKIE['name'];  


В таком виде скрипт установит куку но не подставит в строку

Код

if(!isset($_COOKIE['name']))
{
    setcookie('name','vasya');
    header('Location: /');
}

echo 'My name is: '.$_COOKIE['name'];  


А в таком выведет сразу.

Автор: doctor2k 15.12.2013, 18:35
А не проще
Код

if(!isset($_COOKIE['name']))
{
    setcookie('name','vasya');
    echo 'My name is: vasya'; 
}

?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)