Создание движка на MVC. Создаем авторизацию.
Всем привет, и мы продолжаем создавать наш движок на MVC, и сегодня мы создадим авторизацию.
Наши единички вывелись, все хорошо.
Откроем index.php логина в папке view.
<h1>Login</h1>
<form action="login/run" method="post">
<label>Login</label><input type="text" name="login"><br>
<label>Password</label><input type="text" name="password"><br>
<label></label><input type="submit">
</form>
Action задан на метод run. Перейдем в контроллер login.php и добавим его
public function run() {
$this->model->run();
}
В модели логина уберем вывод единичек. Создадим метод run().
public function run() {
$sth = $this->db->prepare("SELECT id FROM users WHERE login = :login AND password = MD5(:password)");
$sth->execute(array(
':login' => $_POST['login'],
':password' => $_POST['password']
));
$data = $sth->fetchAll();
$count = $sth = rowCount();
if($count > 0) {
Session::init();
Session::set('loggedIn', true);
header('Location: ../dashboard');
} else {
header('Location: ../login');
}
}
Здесь мы используем PDO, и я опять же хочу напомнить, кто его не знает, смотрите на сайте статьи по этой теме.
Теперь в нашей базе mvc нам нужно создать таблицу users с 3 полями: id, login, password.
login и password будут типом varchar, login длиной 25, password длиной 32 символа, там будет хэш.
id будет primary key и autoincrement.
Добавим тестового пользователя с логином jesse и паролем - хэшированным логином.
В конструкторе модели логина вызовем родительский конструктор.
public function __construct() {
parent::__construct();
}
Сейчас создадим новый файл dashboard.php в папке controllers, куда скопируем все из контроллера login кроме метода run.
class Dashboard extends Controller {
// ...
public function index() {
$this-view->render('dashboard/index');
}
}
В папке views создадим папку dashboard, где создадим файл index.php с таким содержанием.
Dashboard... Login in only...
В папке libs создадим файл Session.php
class Session {
public static function init() {
@session_start();
}
public static function set($key, $value) {
$_SESSION[$key] = $value;
}
public static function get($key) {
if(isset($_SESSION[$key]))
return $_SESSION[$key];
}
public static function destroy() {
// unset($_SESSION);
session_destroy();
}
}
Добавьте подключение этого файла в index.php после подключения базы данных.
require 'libs/Session.php';
Вызовем в конструкторе класса Dashboard метод init() класса Session.
public function __construct() {
parent::__construct();
Session::init();
$logged = Session::get('loggedIn');
if($logged == false) {
Session::destroy();
header('Location: ../login');
exit();
}
}
Также создадим метод logout() в классе dashboard.
public function logout() {
Session::destroy();
header('Location: ../login');
exit();
}
Теперь перейдем в header.php и создадим там ссылку на выход в меню.
<?php if(Session::get('loggedIn') == true):?>
<a href="<?php echo URL; ?>dashboard/logout">Logout</a>
<?php else: ?>
<a href="<?php echo URL; ?>login">Login</a>
<?php endif; ?>
Теперь добавим вызов метода init() перед блоком с id=header
<?php Session::init(); ?>
Все что осталось, определить константы в файле database.php.
define('DB_TYPE', 'mysql');
define('DB_HOST', 'localhost');
define('DB_NAME', 'mvc');
define('DB_USER', 'root');
define('DB_PASS', '');
Теперь перейдите в файл Database.php и там измените подключение, подставив вместо значений константы, которые мы только что определили.
Итак, могу вас поздравить, мы только что сделали авторизацию. Спасибо за внимание и удачи!
-
- Михаил Русаков
Комментарии (17):
Михаил, отредактируйте код пожалуйста, а то в одну строчку всё...
Ответить
Всё исправлено!
Ответить
Можете написать статью про добавление комментариев на сайт через аякс?
Ответить
А что в этом сложного? Просто отправляйте запросы через JavaScript на сервер, где добавляйте комментарий. Если не понятно, то напишу.
Ответить
Завтра будет
Ответить
Сложного вроде бы ничего, вопрос только, куда пихать сам JavaScript, насколько я понял то во View (хотя это вроде как работа с сервером, так что это задача модели и контроллера), и подключать в хедер. Может статью не про коментарии, а просто доработать форму входа, сделать проверку логина на аяксе.
Ответить
Ну и конечно хотелось бы наглядно посмотреть, как к этому всему прикручивать шаблонизатор и .tpl файлы, как я понимаю шаблонизатор должен быть частью модели, или как отдельная библиотека
Ответить
"$this-view->render('dashboard/index');" замените на "$this->view->render('dashboard/index');"... Также замените "$count = $sth = rowCount();" на "$count = $sth->rowCount();".
Ответить
Михаил а как сделать чтобы после авторизации .закрытия и открытия браузера(снова) авторизация пользователя сохранялась если можн ото подробный код .Спасибо
Ответить
Михаил, подскажите из-за чего данная ошибка вылетает после авторизации: Это главный контроллерЭто вид Fatal error: Call to a member function prepare() on null in C:\OpenServer\domains\mvc\models\login_model.php on line 7 Все делал как Вы описывали!
Ответить
Хотелось бы, чтобы последний абзац выглядел так - ...Теперь перейдите в файл Database.php и там измените подключение к БД в конструкторе, подставив вместо имеющихся значений, константы которые мы только что определили. Вот так - public function __construct() { parent::__construct(DB_TYPE.':host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS); } Ибо сходу c кавычками и точечками, можна "дупля не отбить".))
Ответить
Warning: Missing argument 2 for Session::get(), called in H:\home\pdo.learn\www\controllers\dashboard.php on line 9 and defined in H:\home\pdo.learn\www\libs\session.php on line 9 постоянно висит А при logout'е орет что заголовок уже отправлен Warning: Cannot modify header information - headers already sent by (output started at H:\home\pdo.learn\www\libs\session.php:9) in H:\home\pdo.learn\www\controllers\dashboard.php on line 18
Ответить
Notice: Undefined property: Login_Model::$db in ...models/login_model.php on line 13 Подскажите плиз, не могу разобраться вторые сутки. и еще одна: Fatal error: Call to a member function prepare() on a non-object in ...models/login_model.php on line 13
Ответить
Все идеально работает, но когда логин хочет отработать, ссылается $sth = $this->db->prepare, к "db"
Ответить
Разобрался, переменная не так обозвана была, теперь другая ошибка Warning: Cannot modify header information - headers already sent by (output started at /home/c/cf59149/mysite.ru/public_html/libs/Controller.php:9) in /home/c/cf59149/mysite.ru/public_html/models/login_model.php on line 26 шлет на if($count > 0) { Session::init(); Session::set('loggedIn', true); header('Location: ../dashboard'); } else { header('Location: ../login'); } строчка "header('Location: ../login');"
Ответить
Разобрался, теперь у меня ничего не происходит, чтобы в адресную строку не вводил, не dashboard, не login, не login/run
Ответить
Подскажите как исправить ошибку "Вызов неопределённой функции rowCount(). Fatal error: Call to undefined function rowCount() in Z:\home\privet.local\www\models\login_model.php on line 12 Спасибо.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.