Jelajahi Sumber

Регистрация, вход и выход пользователя

Alexander Musikhin 2 tahun lalu
induk
melakukan
edda253e80

+ 1 - 0
app/bootstrap.php

@@ -4,5 +4,6 @@ require_once ('core/controller.php');
 require_once ('core/model.php');
 require_once ('core/view.php');
 require_once ('core/route.php');
+require_once ('core/db.php');
 
 Route::start();

+ 2 - 1
app/controllers/controller_main.php

@@ -6,6 +6,7 @@ class controller_main extends Controller
 {
     public function __construct()
     {
+        parent::__construct();
         if(empty($_SESSION['user'])){
             header('Location: /user/login');
         }
@@ -13,7 +14,7 @@ class controller_main extends Controller
 
     function index()
     {
-        $this->view->generate('main_view.php', 'template_view.php');
+        $this->view->generate('main_view.php');
 
     }
 }

+ 38 - 4
app/controllers/controller_user.php

@@ -3,15 +3,49 @@
 class controller_user extends Controller
 {
 
+    public function __construct()
+    {
+        parent::__construct();
+        $this->model = new Model_user();
+        $this->view = new View();
+    }
     // login page
     public function login(){
+        $error = [];
+
         if(isset($_POST['login'], $_POST['password'])){
-            // todo обратиться к модели: есть ли пользователь,
-            // todo если нет - создать и залогинить (установить user в сессии)
-            // todo если есть - проверить пароль
+            // получаем пользователя и сравниваем пароль
+            $user = $this->model->get_user_by_login($_POST['login']);
+            if(is_array($user) && ($user['password'] == $_POST['password'])){
+                $_SESSION['user'] = $user;
+                header('Location: /');
+                exit;
+            }
+            $error['errlogin'] = 'Неверный логин или пароль!';
+        }
 
+        $this->view->generate('login_view.php', $error);
+    }
+
+    public function register(){
+
+        if(isset($_POST['login'], $_POST['password'], $_POST['password_confirm'])){
+            if($_POST['password'] == $_POST['password_confirm']){
+                $this->model->register($_POST['login'], $_POST['password']);
+                $_SESSION['user'] = $this->model->get_user_by_login($_POST['login']);
+                header('Location: /');
+                exit;
+            }
+            $error['errregister'] = 'Введенные пароли не совпадают';
+            $this->view->generate('login_view.php', $error);
+        } else {
+            die('err');
+            header('Location: /');
         }
+    }
 
-        $this->view->generate('login_view.php');
+    public function logout(){
+        session_destroy();
+        header('Location: /');
     }
 }

+ 42 - 0
app/core/db.php

@@ -0,0 +1,42 @@
+<?php
+
+class db
+{
+    private $credinternals = [
+        'dbhost' => 'localhost',
+        'dbname' => 'myproject',
+        'dbuser' => 'root',
+        'dbpass' => ''
+    ];
+
+    public  $conn;
+
+    public function __construct(){
+
+
+        $this->conn = mysqli_connect(
+            $this->credinternals['dbhost'],
+            $this->credinternals['dbuser'],
+            $this->credinternals['dbpass'],
+            $this->credinternals['dbname']
+        );
+
+        if(!$this->conn) die('DB connect error!');
+
+    }
+
+    public function query($q){
+        $data = mysqli_query($this->conn, $q);
+        if(is_bool($data)) {
+            return $data;
+        } else {
+            return $data->fetch_assoc();
+        }
+
+    }
+
+    public function escape($str){
+        return "'" . mysqli_real_escape_string($this->conn, $str) . "'";
+    }
+
+}

+ 0 - 2
app/core/model.php

@@ -1,7 +1,5 @@
 <?php
 
-namespace core;
-
 class model
 {
     public function get_data()

+ 1 - 0
app/core/route.php

@@ -35,6 +35,7 @@ class Route
 
         $model_file = strtolower($model_name).'.php';
         $model_path = "app/models/".$model_file;
+
         if(file_exists($model_path))
         {
             include "app/models/".$model_file;

+ 2 - 2
app/core/view.php

@@ -3,7 +3,7 @@
 
 class view
 {
-    public function generate($content_view, $template_view = 'template_view.php', $data = null)
+    public function generate($content_view, $data = null)
     {
 
         if(is_array($data)) {
@@ -11,6 +11,6 @@ class view
             extract($data);
         }
 
-        include 'app/views/'.$template_view;
+        include 'app/views/template_view.php';
     }
 }

+ 25 - 0
app/models/model_user.php

@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @property $db
+ */
+class Model_user extends Model
+{
+    private $db;
+    public function __construct()
+    {
+        $this->db = new db();
+    }
+
+    public function register($login, $password){
+        // создаем пользователя в БД
+
+        $this->db->query("INSERT INTO users SET `login` = " . $this->db->escape($login) .
+            ", `password` = " . $this->db->escape($password)
+        );
+    }
+
+    public function get_user_by_login($login){
+        return $this->db->query("SELECT * FROM users WHERE `login` = " . $this->db->escape($login));
+    }
+}

+ 48 - 29
app/views/login_view.php

@@ -1,33 +1,52 @@
-<form action="/user/login" method="post">
-    <div class="row mt-5">
-        <div class="col-12 my-4 fs-1">Вход</div>
-        <div class="col-4">
-            <input class="form-control" type="text" name="login" placeholder="логин">
-        </div>
-        <div class="col-4">
-            <input class="form-control" type="password" name="password" placeholder="пароль">
-        </div>
-        <div class="col-4">
-            <input type="submit" class="btn btn-dark">
-        </div>
+<nav class="mt-5">
+    <div class="nav nav-tabs" id="nav-tab" role="tablist">
+        <button class="nav-link <? if(!isset($errregister)): ?> active <? endif; ?>" id="nav-login-tab" data-bs-toggle="tab" data-bs-target="#nav-login"
+                type="button" role="tab" aria-controls="nav-login" aria-selected="true">Вход</button>
+        <button class="nav-link <? if(isset($errregister)): ?> active <? endif; ?>" id="nav-register-tab" data-bs-toggle="tab" data-bs-target="#nav-register"
+                type="button" role="tab" aria-controls="nav-profile" aria-selected="false">Регистрация</button>
     </div>
-</form>
+</nav>
+<div class="tab-content p-4 border-bottom border-start border-end">
 
+    <div class="tab-pane fade <? if(!isset($errregister)): ?> show active <? endif; ?>" id="nav-login" role="tabpanel" aria-labelledby="home-tab">
+        <? if(isset($errlogin)): ?>
+        <span class="text-danger"><?=$errlogin; ?></span>
+        <? endif; ?>
+        <form action="/user/login" method="post">
+            <div class="row mt-3">
+                <div class="col-4">
+                    <input minlength="3" class="form-control" type="text" name="login" placeholder="логин">
+                </div>
+                <div class="col-4">
+                    <input class="form-control" type="password" name="password" placeholder="пароль">
+                </div>
+                <div class="col-4">
+                    <input type="submit" class="btn btn-dark">
+                </div>
+            </div>
+        </form>
+    </div>
 
-<form action="/user/register" method="post">
-    <div class="row mt-5">
-        <div class="col-12 my-4 fs-1">Регистрация</div>
-        <div class="col-3">
-            <input class="form-control" type="text" name="login" placeholder="логин">
-        </div>
-        <div class="col-3">
-            <input class="form-control" type="password" name="password" placeholder="пароль">
-        </div>
-        <div class="col-3">
-            <input class="form-control" type="password" name="password_confirm" placeholder="подтверждение пароля">
-        </div>
-        <div class="col-3">
-            <input type="submit" class="btn btn-dark">
-        </div>
+    <div class="tab-pane fade <? if(isset($errregister)): ?>show active <? endif; ?>" id="nav-register">
+        <? if(isset($errregister)): ?>
+            <span class="text-danger"><?=$errregister; ?></span>
+        <? endif; ?>
+        <form action="/user/register" method="post">
+            <div class="row mt-3">
+                <div class="col-3">
+                    <input minlength="3" class="form-control" type="text" name="login" placeholder="логин">
+                </div>
+                <div class="col-3">
+                    <input minlength="5" class="form-control" type="password" name="password" placeholder="пароль">
+                </div>
+                <div class="col-3">
+                    <input minlength="5" class="form-control" type="password" name="password_confirm" placeholder="подтверждение пароля">
+                </div>
+                <div class="col-3">
+                    <input type="submit" class="btn btn-dark">
+                </div>
+            </div>
+        </form>
     </div>
-</form>
+
+</div>

+ 9 - 2
app/views/main_view.php

@@ -1,2 +1,9 @@
-d asjdj
-
+<div class="row mt-3">
+    <div class="col-6">
+        <h1>Блог</h1>
+    </div>
+    <div class="col-6 text-end">
+        <?=$_SESSION['user']['login']; ?>
+        <a href="/user/logout">Выход</a>
+    </div>
+</div>

+ 3 - 0
app/views/template_view.php

@@ -15,6 +15,9 @@
                 <!-- end main block -->
             </div>
         </section>
+            <pre>
+                <? var_dump($_SESSION);?>
+            </pre>
         <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe" crossorigin="anonymous"></script>
     </body>
 </html>

+ 1 - 0
index.php

@@ -1,3 +1,4 @@
 <?php
+session_start();
 ini_set('display_errors', 1);
 require_once 'app/bootstrap.php';