How to Signup User using PHP MVC with example
In this example we using Models, Views, Controller Structure for Registering an users data.
CREATE TABLE IF NOT EXISTS `register` ( `id` int(11) NOT NULL, `user_name` varchar(50) NOT NULL, `email_id` varchar(50) NOT NULL, `password` varchar(50) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Here is the view file index.php under register folder, for displaying the form which will be used for registering users data.
index.php
register/signup»> First name:
Last name:
Password:
To Register data in the database first we have to create a Controller file.
controller/register.php
function index()< $this->view->render('register/index'); > function signup()< $user_name=$_POST['user_name']; $email_id=$_POST['email_id']; $password=$_POST['password']; $count=$this->model->check_user($user_name,$email_id); if($count > 0) < echo 'This User Already Exists'; >else< $data = array( 'id' =>null, 'user_name' =>$_POST['user_name'], 'email_id' =>$_POST['email_id'], 'password' =>$_POST['password'] ); $this->model->insert_user($data); > header('location:index'); > >
Here is the model file which we are using for Registering data to database.
The file register_model.php is created under Models folder
models/register_model.php
index_model.php
public function check_user($user_name,$email_id) < $result= $this->db->select("SELECT * FROM `register` WHERE user_name = '".$user_name."' OR email_id = '".$email_id."'"); $count = count($result); return $count; > public function insert_user($data) < $this->db->insert('register', $data); > >
Path: localhost/project_folder_name/view_folder_name/view_filename Example: localhost/mvc/register/index
Создание движка на MVC. Создаем авторизацию.
Всем привет, и мы продолжаем создавать наш движок на MVC, и сегодня мы создадим авторизацию.
Наши единички вывелись, все хорошо.
Откроем index.php логина в папке view.
Login
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()
Сейчас создадим новый файл dashboard.php в папке controllers, куда скопируем все из контроллера login кроме метода run.
class Dashboard extends Controller // .
public function index() $this-view->render(‘dashboard/index’);
>
>
В папке views создадим папку dashboard, где создадим файл index.php с таким содержанием.
В папке 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 после подключения базы данных.
Вызовем в конструкторе класса 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 и создадим там ссылку на выход в меню.
Теперь добавим вызов метода init() перед блоком с id=header
Все что осталось, определить константы в файле database.php.
define(‘DB_TYPE’, ‘mysql’);
define(‘DB_HOST’, ‘localhost’);
define(‘DB_NAME’, ‘mvc’);
define(‘DB_USER’, ‘root’);
define(‘DB_PASS’, »);
Теперь перейдите в файл Database.php и там измените подключение, подставив вместо значений константы, которые мы только что определили.
Итак, могу вас поздравить, мы только что сделали авторизацию. Спасибо за внимание и удачи!
Создано 07.08.2014 20:40:56
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 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 Спасибо.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.
Безопасная авторизация пользователей на MVC и PHP
В этой статье мы разберем, как сделать авторизацию на MVC. Будет использоваться вот такая база данных: Первым делом, добавим маршруты в файле routes.php, он находится в папке config. Задаем следующие маршруты:
'user/login' => 'user/login', 'user/logout' => 'user/logout',
Теперь заходим в папку controllers и открываем файл UserController. В нем нам нужно написать метод для отрисовки страницы авторизации, метод для выхода их системы и функцию, которая будет сравнивать пароли. Метод Login. Чтобы избежать ошибок сразу объявим переменные email и password. Далее, если нажали кнопку «Войти», то методом POST получаем введенные в форме данные:
public function actionLogin() < $email = false; $password = false; if (isset($_POST['submit'])) < $email = $_POST['email']; $password = $_POST['password']; $errors = false;
Функциями checkEmail и checkPassword проверяем полученные данные на корректность ввода. Эти функции были описаны в уроке по созданию регистрации. С помощью функции checkUserDataHash делаем запрос в базу данных по введенному адресу электронной почты, в результате получаем все данные пользователя с таким адресом электронной почты в переменную check. Затем записываем пароль найденного пользователя в переменную hashed_password, а его id в переменную userId:
$errors[] = 'Неправильный email'; > if (!User::checkPassword($password)) < $errors[] = 'Пароль не должен быть короче 6-ти символов'; >$check = User::checkUserDataHash($email); $hashed_password = $check['password']; $userId = $check['id'];
Далее с помощью функции verify проверяем, совпал ли введенный пароль с паролем пользователя найденного по email. Если совпал, то используем функцию auth, которая будет описана далее, а затем возвращаем пользователя на главную страницу. Но если пароль не совпал, то в массив errors записываем сообщение об ошибке:
if ($this->verify($password, $hashed_password)) < User::auth($userId); require_once(ROOT . '/user/index.php'); return true; >else $errors[] = 'Неправильные данные для входа на сайт'; > require_once(ROOT . '/user/login.php'); return true; >
Метод Logout. Тут мы удаляем переменную сессии user, затем перенаправляем пользователя на главную страницу.
public function actionLogout() < unset($_SESSION["user"]); session_destroy(); header("Location: /"); return true; >
Функция verify. Хеширует введенный пароль, сравнивает его с паролем из БД, если пароль совпал, то возвращает true, иначе false.
function verify($password, $hashedPassword)
Переходим в папку models и открываем файл Users.php. Там создаем следующие функции: checkUserDataHash – функция, которая ищет пользователя по введенному адресу электронной почты, использует обычный предподготовленный запрос:
public static function checkUserDataHash($email) < // Соединение с БД $db = Db::getConnection(); // Текст запроса к БД $sql = 'SELECT * FROM users WHERE email = :email'; // Получение результатов. Используется подготовленный запрос $result = $db->prepare($sql); $result->bindParam(':email', $email, PDO::PARAM_STR); // Указываем, что хотим получить данные в виде массива $result->setFetchMode(PDO::FETCH_ASSOC); $result->execute(); return $result->fetch(); >
Функция auth. При удачной авторизации записывает в переменную сессии значение переменной userId, которое было получено в методе Login.
public static function auth($userId) < // Записываем идентификатор пользователя в сессию $_SESSION['user'] = $userId; >
Функция isGuest. Проверяет, существует ли переменная user, если да, то это значит, что пользователь авторизирован и он не гость, поэтому отправляет false. Если же переменной не существует, то отправляет true – пользователь гость
public static function isGuest()
Теперь напишем саму страницу, которая будет содержать форму авторизации. Тут, как и в форме регистрации будет выводиться ошибки, которые могут возникнуть в процессе авторизации. Делается это с помощью цикла foreach, который выводит содержимое массива errors:
Теперь проверяем, если пользователь гость, то есть неавторизированный пользователь, то показываем ему форму авторизации. Если же пользователь авторизирован, то показываем ему сообщение «Вы уже авторизированы».
Авторизация
"/>
"/>
Если вы еще по какой то причине не зарегистрированы на нашем сервисе, то не теряйте времени зарегистрируйтесь. Вы уже авторизированы