Главная страница  /  Занятия  /  #15  /  Разработать личный кабинет пользователя с использованием cookie и MySQL

Разработать личный кабинет пользователя с использованием cookie и MySQL

Задание:

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

Посмотреть решение

Структура:

   /result
    │
    ├──/includes
    │   │
    │   ├──.htaccess
    │   │
    │   ├──configuration.inc
    │   │
    │   ├──connect.inc
    │   │
    │   ├──disconnect.inc
    │   │
    │   ├──functions.inc
    │   │
    │   ├──getuserinfo.inc
    │   │
    │   ├──gotologinpage.inc
    │   │
    │   ├──login.inc
    │   │
    │   ├──logout.inc
    │   │
    │   ├──mainmenu.inc
    │   │
    │   └──unsetuservariables.inc
    │
    ├──/skins
    │   │
    │   ├──.htaccess
    │   │
    │   ├──getuserinfo.skin
    │   │
    │   ├──login.skin
    │   │
    │   └──mainmenu.skin
    │
    └──index.phtml

Директория includes:

Файл .htaccess:

   <Files *.inc>
    Order deny,allow
    Deny from all
   </Files>

Файл configuration.inc:

   <?
    $systemActions = array('login', 'logout', 'mainmenu', 'getuserinfo');
    $sexArray = array('Ж', 'М');
   
    $cookieDomain = $_SERVER['HTTP_HOST'];
    $cookieName = 'cookie-authorization';
    $cookiePath = preg_replace('/[^\/]+$/', '', $_SERVER['REQUEST_URI']);
    $cookieSecure = true;
    $cookieHttpOnly = true;
   
    $dbhost = 'localhost';
    $dbname = '******_education';
    $dbuser = '******_education';
    $dbpass = '******';
   
    $domainName = $_SERVER['HTTP_HOST'];
    $rootDirectory = preg_replace('/[^\/]+$/', '', $_SERVER['REQUEST_URI']);
   ?>

Файл connect.inc:

   <?
    mysql_connect($dbhost, $dbuser, $dbpass);
    mysql_select_db($dbname);
   
    mysql_query('set names utf-8;');
    mysql_query('set collation_connection=utf8_general_ci;');
   
    mysql_query('lock tables education_users write;');
   ?>

Файл disconnect.inc:

   <?
    mysql_query('unlock tables;');
    mysql_close();
   ?>

Файл functions.inc:

   <?
    function getSkin($skinName)
    {
     $skinName = 'skins/'.$skinName.'.skin';
     $skinContent = file_get_contents($skinName);
     return "return <<<TMP\r\n{$skinContent}\r\nTMP;\r\n";
    }
   ?>

Файл getuserinfo.inc:

   <?
    if(!isset($user_id) || !$user_id)
    {
     require('includes/unsetuservariables.inc');
     require('includes/disconnect.inc');
     require('includes/gotologinpage.inc');
    }
   
    print eval(getSkin('getuserinfo'));
    return;
   ?>

Файл gotologinpage.inc:

   <?
    $LocationString = 'Location: https://'.$domainName.$rootDirectory;
    header($LocationString);
    exit;
   ?>

Файл login.inc:

   <?
    if(!isset($_POST['userLoginInForm']) || !isset($_POST['userPasswordInForm']))
    {
     print eval(getSkin('login'));
     return;
    }
    else
    {
     $userResult = mysql_query('select user_id from education_users where user_login = \''.$_POST['userLoginInForm'].'\' and user_password = \''.sha1($_POST['userPasswordInForm']).'\';');
     if(mysql_num_rows($userResult) != 1)
     {
      print eval(getSkin('login'));
      return;
     }
    }
   
    list($user_id) = mysql_fetch_row($userResult);
    $user_hash = sha1(time());
    mysql_query('update education_users set user_hash = \''.$user_hash.'\' where user_id = '.$user_id.';');
    setcookie($cookieName, serialize(array($user_id, $user_hash)), 0, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
    require('includes/disconnect.inc');
   
    $LocationString = 'Location: https://'.$domainName.$rootDirectory.'?a=mainmenu';
    header($LocationString);
    exit;
   ?>

Файл logout.inc:

   <?
    if(!isset($user_id) || !$user_id)
    {
     require('includes/unsetuservariables.inc');
     require('includes/disconnect.inc');
     require('includes/gotologinpage.inc');
    }
   
    mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
    setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
    require('includes/unsetuservariables.inc');
    require('includes/disconnect.inc');
    require('includes/gotologinpage.inc');
   ?>

Файл mainmenu.inc:

   <?
    if(!isset($user_id) || !$user_id)
    {
     require('includes/unsetuservariables.inc');
     require('includes/disconnect.inc');
     require('includes/gotologinpage.inc');
    }
   
    print eval(getSkin('mainmenu'));
    return;
   ?>

Файл unsetuservariables.inc:

   <?
    if(isset($user_id)) unset($user_id);
    if(isset($user_password)) unset($user_password);
    if(isset($user_hash)) unset($user_hash);
    if(isset($user_name)) unset($user_name);
    if(isset($user_login)) unset($user_login);
    if(isset($user_phone)) unset($user_phone);
    if(isset($user_sex)) unset($user_sex);
    if(isset($user_age)) unset($user_age);
   ?>

Директория skins:

Файл .htaccess:

   <Files *.skin>
    Order deny,allow
    Deny from all
   </Files>

Файл getuserinfo.skin:

   <!DOCTYPE html>
   
   <html lang="ru">
   
    <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Информация о пользователе</title>
    </head>
   
    <body>
     <h1>Информация о пользователе {$user_name}</h1><br>
     Ваш ID: {$user_id}<br>
     Ваше имя: {$user_name}<br>
     Ваш телефон: {$user_phone}<br>
     Ваш пол: {$sexArray[$user_sex]}<br>
     Ваш возраст: {$user_age}<br>
     Ваш логин: {$user_login}<br>
     Хэш вашего пароля: {$user_password}<br>
     Хэш вашей сессии: {$user_hash}<br><br><br>
     &larr; <a href="{$rootDirectory}?a=mainmenu">Вернуться в главное меню</a>
    </body>
   
   </html>

Файл login.skin:

   <!DOCTYPE html>
   
   <html lang="ru">
   
    <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Вход в систему</title>
    </head>
   
    <body>
     <h1>Вход в систему</h1>
     <form name="loginForm" action="{$rootDirectory}?a=login" method="post">
      <input type="text" name="userLoginInForm">
      <input type="password" name="userPasswordInForm">
      <input type="submit" value="Войти в систему">
     </form>
    </body>
   
   </html>

Файл mainmenu.skin:

   <!DOCTYPE html>
   
   <html lang="ru">
   
    <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Главное меню системы</title>
    </head>
   
    <body>
     <h1>Здравствуйте, {$user_name}</h1><br>
     Вы успешно прошли авторизацию и находитесь в главном меню системы. Эта часть сайта видна только авторизованным пользователям.<br><br>
     &mdash; <a href="{$rootDirectory}?a=getuserinfo">Информация о пользователе</a><br><br><br>
     <a href="{$rootDirectory}?a=logout">Выйти из системы</a> &rarr;
    </body>
   
   </html>

phtml-документ (index.phtml):

   <?
    require('includes/configuration.inc');
    require('includes/functions.inc');
    require('includes/connect.inc');
   
    if(!isset($_GET['a']) || !in_array($_GET['a'], $systemActions)) $action = 'login';
    else $action = $_GET['a'];
   
    if(isset($user_id)) unset($user_id);
    if(isset($user_hash)) unset($user_hash);
   
    if(isset($_COOKIE[$cookieName]))
    {
     list($user_id, $user_hash) = @unserialize(stripslashes($_COOKIE[$cookieName]));
     $user_id = addslashes($user_id);
     $user_hash = addslashes($user_hash);
   
     if(!is_numeric($user_id))
     {
      mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
      setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
      require('includes/unsetuservariables.inc');
      require('includes/disconnect.inc');
      require('includes/gotologinpage.inc');
     }
   
     $userResult = mysql_query('select user_name, user_login, user_password, user_phone, user_sex, user_age from education_users where user_id = '.$user_id.' and user_hash = \''.$user_hash.'\';');
     if(mysql_num_rows($userResult) != 1)
     {
      mysql_query('update education_users set user_hash = \'\' where user_id = '.$user_id.';');
      setcookie($cookieName, '', time() - 10000, $cookiePath, $cookieDomain, $cookieSecure, $cookieHttpOnly);
      require('includes/unsetuservariables.inc');
      require('includes/disconnect.inc');
      require('includes/gotologinpage.inc');
     }
   
     list($user_name, $user_login, $user_password, $user_phone, $user_sex, $user_age) = mysql_fetch_row($userResult);
     if($action == 'login') $action = 'mainmenu';
    }
   
    require('includes/'.$action.'.inc');
    require('includes/disconnect.inc');
   ?>

Результат:

Результат выполнения задания можно посмотреть здесь.