Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
2 / 2 / 1
Регистрация: 20.12.2013
Сообщений: 90

Класс авторизации / сессии

31.12.2015, 11:17. Показов 6790. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Недавно начал изучать ООП, поэтому пытаюсь написать для себя более-менее рабочий движок. Застрял с написанием ядра. После перезапуска браузера, пользователь вновь не авторизован. Хотя куки и сессии вроде как прописаны правильно.

Код основного ядра системы /includes/core.php:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
/**
 * @package SkyBlog CMS
 * @author MyZik
 * @link http://skyblogcms.ru
 */
 
session_name('sid');
session_start();
 
/**
 * Устанавливаем системные настройки
 */
ini_set("display_errors","1"); // Показ ошибок
ini_set("display_startup_errors","1");
ini_set('error_reporting', E_ALL);
mb_internal_encoding('UTF-8'); // Кодировка по умолчанию
 
/**
 * Системные переменные и константы
 */
define('HOME', dirname(__DIR__)); // Серверный путь к сайту
define('URL', 'http://' . $_SERVER['HTTP_HOST']); // URL-путь к сайту
define('SkyBlog_VERSION', '1.0.0'); // Версия движка (!НЕ МЕНЯТЬ!)
 
/**
 * Инициализация PDO, подключение к БД
 */
$mySQL = parse_ini_file(HOME . '/includes/database.ini');
$db = new PDO('mysql:host=' . $mySQL['host'] .';dbname=' . $mySQL['base'], $mySQL['user'], $mySQL['password'], array(
        PDO::ATTR_PERSISTENT => true
)) or die('Cannot connect to MySQL server :(');
$db->query("SET NAMES utf8");
 
 
/**
 * Загружаем классы
 */
spl_autoload_register(function($name) {
    $file = dirname(__DIR__) . '/includes/classes/' . $name . '.php';
    if(!file_exists($file)) {
        throw new Exception('Autoload class: File '.$file.' not found');
    }
 
    require $file;
});
 
$user = new User;
$userID = $user->userID;
Теперь, код класса User /includes/classes/User.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
/**
 * @package SkyBlog CMS
 * @author MyZik
 * @link http://skyblogcms.ru
 */
 
class User {
    public $user;
    public $userID, $login, $password, $email;
    
    function __construct() {
        global $db;
        
        if (isset($_SESSION['user_id']) && $db->query("SELECT COUNT(*) FROM `users` WHERE `id` = '" . $_SESSION['user_id'] . "' LIMIT 1")->fetchColumn() == 1) {
            # Создаем массив с данными пользователя
            $this->user = $db->query("SELECT * FROM `users` WHERE `id` = '" . $_SESSION['user_id'] . "' LIMIT 1")->fetch();
            
            setcookie('user_id', $user['id'], time() + 60 * 60 * 24 * 365);
            setcookie('password', md5($user['password']), time() + 60 * 60 * 24 * 365);
            
            # Записываем дату последнего посещения
            $db->query("UPDATE `users` SET `last_time_entry` = '" . time() . "' WHERE `id` = '" . $this->user['id'] . "' LIMIT 1");
            
            $this->userID = $this->user['id'];
        }
    }
    
    public static function login($login, $password) {
        global $db;
    
        $user = $db->query("SELECT * FROM `users` WHERE `login` = '$login' AND `password` = '" . md5($password) . "' LIMIT 1")->fetch(); // Создаем массив с данными юзера    
        
        $_SESSION['user_id'] = $user['id']; // Создаем ID в сессиии
    
        $db->query("UPDATE `users` SET `last_entry_time` = '" . time() . "' WHERE `id` = '" . $user['id'] . "' LIMIT 1"); // Обновляем дату последнего посещения
    }
    
    public function registerUser($user_login, $user_password, $user_email) {
        global $db;
        
        $this->login = $user_login;
        $this->password = md5($user_password);
        $this->email = $user_email;
        
        /**
         * Подготавливаем запрос
         */
        $st = $db->prepare("INSERT INTO `users` (`login`, `password`, `email`, `time`)
                VALUES (:login, :password, :email, :time)");
        /**
         * Регистрируем пользователя в БД
         */
        $st->execute(array(
                'login' => $this->login,
                'password' => $this->password,
                'email' => $this->email,
                'time' => time()
        ));
        
        return true;
    }
}
Ну, и простейшая форма авторизации:
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
/**
 * @package SkyBlog CMS
 * @author MyZik
 * @link [url]http://skyblogcms.ru[/url]
 */
 
require_once '../includes/core.php';
 
$title = 'Авторизация';
require_once '../includes/header.php';
 
if (isset($_POST['auth'])) {
    if ($db->query("SELECT COUNT(*) FROM `users` WHERE `login` = '" . $_POST['login'] . "' AND `password` = '" . md5($_POST['password']) . "' LIMIT 1")->fetchColumn() == 1) {
        echo 'Authorized!';
        $user->login($_POST['login'], $_POST['password']);
    } else {
        echo 'Error';
    }
}
?>
 
<div class="list-group">
    <div class="list-group-item">
    <form class="form-horizontal" action="entry.php" method="POST" role="form">
        <div class="form-group">
            <label for="login" class="col-sm-1 control-label">Логин</label>
            <div class="col-sm-10">
                <input type="text" class="form-control" name="login" placeholder="Login">
            </div>
        </div>
         <div class="form-group">
            <label for="password" class="col-sm-1 control-label">Пароль</label>
            <div class="col-sm-10">
                 <input type="password" class="form-control" name="password" placeholder="Password">
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-1 col-sm-10">
                <input type="submit" name="auth" class="btn btn-primary btn-lg btn-block" value="Войти!" />
            </div>
        </div>
    </form>
    </div>
</div>
 
<?php
require_once '../includes/footer.php';
Заранее спасибо за ответ.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.12.2015, 11:17
Ответы с готовыми решениями:

Проверка сессии при авторизации
Здравствуйте! На странице авторизации происходит проверка, что если все поля заполнены, то вызывается функция авторизации. function...

Безопасно ли для авторизации использовать сессии?
Извините за ламерский вопрос, 2-ой день борю ASP. Безопасно ли для авторизации использовать сессии. Или это как то по другому делается?

Сохранение WCF сессии при авторизации
У меня авторизация состоит из такого алгоритма : Клиент передаёт серверу логин и пароль,сервер проверяет,Если эта комбинация верная -...

1
2 / 2 / 1
Регистрация: 20.12.2013
Сообщений: 90
01.01.2016, 23:20  [ТС]
Проблема актуальна...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.01.2016, 23:20
Помогаю со студенческими работами здесь

Можно ли хранить статус авторизации в сессии?
Здравствуйте, подскажите пожалуйста правильно ли я делаю и если нет как правильно? И так регистрация. После проверки данных создается...

Создание сессии для авторизации пользователей и разделения ролей
Здравствуйте, необходимо реализовать авторизацию пользователей и разделение ролей. Через мембершип все более-менее просто, но стало...

Что использовать как идентификатор авторизации: куки или сессии?
Доброго времени суток! На моём сайте есть авторизация: 1. Пользователь вводит логин/пароль 2. На сервере есть таблица users и там 2...

Класс авторизации
В интернете нашёл пример класса(пример) авторизации в контроллере А точнее класс для получения токена авторизации. Немного...

проверка авторизации, или сессии или
Очень прошу, необходима помощь. Есть форум на vBulletin, хочу написать дополнение в виде нескольких страниц. Что нужно? Нужно только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru