Creating our connection
Next, we create our connection to our database by using the OOP approach wherein we’re gonna create a class for our connection. We’re gonna name this file as DbConnection.php.
Getting started
I’ve used CDN for Bootstrap v3.3.7 in this tutorial so you need an internet connection for it to work. You can also use the latest version of bootstrap but there’s a possibility that some of the design I used has changed. I also used XAMPP to run my PHP script and for the MySQL database. Before you proceed to the tutorial below, open first your XAMPP Control Panel and start the “Apache” and “MySQL”.
Home.php
This is our goto page after a successful login.
Index.php
This is our index that contains our login form.
Registration and login form in php using oop
This article will help you to create object oriented user registration and login forms. Use the following procedure.
Step 1
Create a database using the following query.
Create database oopregister.
Step 2
Create a table using the following query:
Step 3
Create a class file named class.php, a database connection is also included in this file (don’t forget to change your database username and password):
- <? php
- define(‘HOST’, ‘localhost’);
- define(‘USER’, ‘root’);
- define(‘PASS’, ”);
- define(‘DB’, ‘oopregister’);
- class DB
- {
- function __construct() {
- $con = mysql_connect(HOST, USER, PASS) or die(‘Connection Error! ‘.mysql_error());
- mysql_select_db(DB, $con) or die(‘DB Connection Error: ->’.mysql_error());
- }
- }
- class User
- {
- public
- function __construct() {
- $db = new DB;
- }
- public
- function register($trn_date, $name, $username, $email, $pass) {
- $pass = md5($pass);
- $checkuser = mysql_query(“Select id from users where email=’$email'”);
- $result = mysql_num_rows($checkuser);
- if ($result == 0) {
- $register = mysql_query(“Insert into users (trn_date, name, username, email, password) values (‘$trn_date’,’$name’,’$username’,’$email’,’$pass’)”) or die(mysql_error());
- return $register;
- } else {
- return false;
- }
- }
- public
- function login($email, $pass) {
- $pass = md5($pass);
- $check = mysql_query(“Select * from users where email=’$email’ and password=’$pass'”);
- $data = mysql_fetch_array($check);
- $result = mysql_num_rows($check);
- if ($result == 1) {
- $_SESSION[‘login’] = true;
- $_SESSION[‘id’] = $data[‘id’];
- return true;
- } else {
- return false;
- }
- }
- public
- function fullname($id) {
- $result = mysql_query(“Select * from users where id=’$id'”);
- $row = mysql_fetch_array($result);
- echo $row[‘name’];
- }
- public
- function session() {
- if (isset($_SESSION[‘login’])) {
- return $_SESSION[‘login’];
- }
- }
- public
- function logout() {
- $_SESSION[‘login’] = false;
- session_destroy();
- }
- }
- ?>
Step 4
Create a register file named register.php as in the following:
Step 5
Create a login file named login.php as in the following:
Step 6
Create an index file named index.php as in the following:
Step 7
Create a style file named style.css as in the following:
- body {
- font – family: Arial, Sans – Serif;
- }
- a {
- color: #78b941; text-decoration:none;}
- a:hover {text-decoration:underline;}
- .form {width: 300px; margin: 0 auto;}
- input[type= ‘text’], input[type = ‘password’] {
- width: 200 px;border – radius: 2 px;border: 1 px solid# CCC;padding: 10 px;color: #333; font-size: 14px; margin-top: 10px;}
- input[type= ‘submit’] {
- padding: 10 px 25 px 8 px;color: #fff;background – color: #78b941; text-shadow: rgba(0,0,0,0.24) 0 1px 0; font-size: 16px; box-shadow: rgba(255,255,255,0.24) 0 2px 0 0 inset,# fff 0 1 px 0 0;border: 1 px solid #6faf38; border-radius: 2px; margin-top: 10px; cursor:pointer;}
- input[type= ‘submit’]: hover {
- background – color: #80c248;}
Step 8
After creating all the preceding files and running the program, the following will be the output screens of the registration and login forms.
- Registration Screen.
- Login Screen.
- Dashboard Screen.
If you have any kind of problem, leave it in the comments section, I will try my best to solve your issues, thanks.
Добавляем соль
На самом деле md5 не дает полной защиты от расшифровки.
В случае простого или очень популярного пароля хеш элементарно расшифровывается с помощью гугла.
Класс для работы с массивами
В процессе обработки пользовательских данных нам всегда, так или иначе, приходится обращаться к массивам $_GET, $_POST или $_REQUEST. Что-то иногда приходится брать из массива $GLOBALS.
Просто так брать и что-то делать с пользовательскими данными достаточно… наивно, пожалуй. Когда мы берем некое значение для его дальнейшей обработки, нужно убрать из него, например, лишние пробелы, html-теги, преобразовать «опасные» символы в html-сущности и т.п.
Чтобы не делать это каждый раз, когда мы обращаемся к данным, полученных из суперглобальных массивов $_GET, $_POST или $GLOBALS, мы создадим статический класс Core_Array для работы с массивами.
Код реализации этого класса, пожалуй, вряд ли требует какого-то особого описания. Читатель должен всё хорошо понять.
Обработчик формы регистрации пользователя на сайте
Добавляем обработчик формы регистрации пользователя на сайте, который будет срабатывать при нажатии кнопки отправки формы.
Порядок работы с формой регистрации пользователя
Возвращаемся к работе над формой регистрации пользователя. Что произойдет, если её отправить? Каждое из полей формы имеет атрибут required. Это не позволит отправить форму до тех пор, пока все поля с этим атрибутом не будут заполнены. Но, допустим, мы их заполнили. Что дальше?
Дальше требуется проверить, доказал ли пользователь, что он не робот. Все данные формы, в том числе и поле капчи, проверять и обрабатывать мы будем при помощи JavaScript, а точнее — AJAX.
Начнем с обработки поля капчи. Вероятно, нашей форме не хватает поля для вывода сообщений пользователю. Добавим его над самой формой.
Проверка капчи
Как уже было сказано выше, первым делом следует проверить корректность капчи. Этим и займёмся. В качестве капчи мы используем Google reCAPTCHA.
Реализация работы метода getbylogin()
Читателя здесь заинтересует то, что написано для метода __call().
Регистрация пользователей. код целиком. используем ооп php, javascript, pdo mysql. часть вторая
Переходим к непосредственной работе с пользователями сайта. Первым делом определим, авторизован ли пользователь. Здесь нам придется немного забежать вперед. В файле bootstrap.php будем сразу же получать информацию об авторизованном пользователе.
<?php // Файл bootstrap.php // Инициализируем константу для защиты от стороннего доступа define("LEZH", TRUE); // Определяем каталог исходных файлов нашего сайта define("SITE_DIR", __DIR__); // Определяем путь к каталогу файла с определением ядра сайта define("CORE_DIR", SITE_DIR . DIRECTORY_SEPARATOR . "modules" . DIRECTORY_SEPARATOR . "core" . DIRECTORY_SEPARATOR); // Подключаем файл с определением класса ядра нашего сайта require_once(CORE_DIR . "core.php"); // Инициализируем ядро сайта Core::init(); // Получаем информацию об авторизации пользователя Core::factory("User")->getAuthUser(); ?>
Читателю очевидно, что нам нужно определить класс User, который будет иметь метод getCurrent(), возвращающий информацию об авторизованном пользователе. Кроме этого, конечно же, следует в классе Core создать фабричный метод. Начнем именно с него. Заодно немного преобразуем код этого класса.
<?php // Файл modules/core/core.php defined("LEZH") || exit("Доступ к файлу запрещен"); /** * Класс ядра сайта будет статическим */ class Core { // Конфигурации чего-либо на нашем сайте static protected $_config = array(); /** * Инициализирует ядро сайта * ничего не возвращает */ static public function init() { // Получаем конфигурацию подключения к СУБД // Данные для подключения хранятся внутри каталога core в каталоге config static::$_config["database"] = include("config/database.php"); // Регистрируем функции Core::_registerFunctions(); // Подключаемся к СУБД Core_Database::instance() ->setConfig(static::$_config["database"]) ->connect(); } /** * Регистрируем пользовательские функции * @param string $class путь к файлу с определением класса */ static protected function _registerFunctions() { // Реализация метода _autoload spl_autoload_register(array("Core", "_autoload")); } /** * Подключает пользовательские классы */ static public function _autoload($class) { // Получаем путь к файлу с определением класса $path = CORE_DIR . static::getClassPath($class); // Подключаем файл с определением класса require_once($path); } /** * Получает путь к файлу с определением класса */ static public function getClassPath($class) { // Разбираем путь к файлу $aPathToClass = explode("_", $class); // Если имя начиналось с Core, убираем его из массива if (strtolower($aPathToClass[0]) == "core") { array_shift($aPathToClass); } // Последним элементом массива должно быть имя файла $sFileName = strtolower(array_pop($aPathToClass)); // Если нет имени файла, ничего не делаем if (empty($sFileName)) { return; } // Если такой файл существует if (is_file(CORE_DIR . $sFileName . ".php")) { $path = strtolower(implode(DIRECTORY_SEPARATOR, $aPathToClass)) . $sFileName . ".php"; } // Если такого файла нет, проверяем, существует ли файл описания модели elseif (is_file(CORE_DIR . $sFileName . DIRECTORY_SEPARATOR . "model.php")) { $path = strtolower($sFileName . DIRECTORY_SEPARATOR . "model.php"); } else { throw new Exception("Не существует файла с определением класса <strong>" . $class . "</strong>"); } // Возвращаем путь к файлу return $path; } /** * Создает экземпляр указанного класса */ static public function factory($class) { // Получаем путь к файлу $path = static::getClassPath($class); // Проверяем, существует ли класс с указанным именем // попробуем дополнить имя класса if (!class_exists($class)) { $class = $class . "_Model"; } return new $class(); } } ?>
Теперь нам нужно определить класс модели User_Model.
<?php // Файл modules/core/user/model.php defined("LEZH") || exit("Доступ к файлу запрещен"); class User_Model extends Core_ORM { /** * Конструктор класса */ public function __construct() { } /** * Устанавливает авторизованного пользователя */ public function authUser() { } /** * Получает авторизованного пользователя */ public function getAuthUser() { } } ?>
Очевидно, что класс User_Model наследует свойства и методы класса Core_ORM. Определяем предварительно и его.
<?php // Файл modules/core/orm.php defined("LEZH") || exit("Доступ к файлу запрещен"); class Core_ORM { public function __construct() { } } ?>
Теперь нужно объяснить, что происходит при создании экземпляра объекта класса User_Model. Мы в этом случае получаем из базы данных информацию о всех существующих пользователях.
Самое время поговорить о том, какие именно данные у нас будут храниться в MySQL о зарегистрированных пользователях. Во-первых, это будет логин, во-вторых, пароль, в-третьих, адрес электронной почты, затем дата регистрации. Храниться это будет в таблице базы данных Users. Именно Users — множественное число. В качестве логина пользователя будет использоваться адрес электропочты. Давайте создадим такую таблицу.
-- -- Структура таблицы `users` -- DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) UNSIGNED NOT NULL, `login` varchar(128) NOT NULL, `password` varchar(128) NOT NULL, `registration_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted` tinyint(1) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- -- Индексы сохранённых таблиц -- -- -- Индексы таблицы `users` -- ALTER TABLE `users` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `users` -- ALTER TABLE `users` MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; COMMIT;
Вся работа с пользователями сайта будет осуществляться через класс User_Model. Выглядеть это будет так.
<?php // Логин пользователя, переданный, например, методом $_POST $sLogin = htmlspecialchars(trim(strval($_POST["login"]))); $sPassword = htmlspecialchars(trim(strval($_POST["password"]))); // Создаем экземпляр класса модели пользователя $oUser = Core::factory("User"); // Находим пользователя по указанному логину $oUser->getByLogin($sLogin) // Подтверждаем соответствие переданного пароля указанному логину ->verifyPassword($sPassword); // Если такой пользователь есть if (!is_null($oUser)) { // Авторизуем пользователя $oUser->authUser(); } // Метод getAuthUser() вернет информацию об авторизованном пользователе $oUser->getAuthUser(); // Метод deauthUser() отменяет авторизацию пользователя $oUser->deauthUser(); // Следующим образом мы будем регистрировать новых пользователей $oUser = Core::factory("User"); // Регистрируем пользователя, если он не зарегистрирован if (!$oUser->ifExists($sLogin)) { $oUser->login($sLogin) ->password($sPassword) ->registration(); } // Получать информацию о конкретном пользователе, например, авторизованном, тоже будет легко $oUser = Core::factory("User"); // Можем вывести логин пользователя на экран print $oUser->login; // Можем показать дату регистрации пользователя print (new DateTime($oUser->registration_date))->format("d.m.Y"); ?>
Теперь, чтобы это всё работало, нам осталось немного поработать над классами Core_ORM, User_Model и Core_Database. Об этом пойдет речь в другой части статьи.