Сразу отвечу на гневные реплики по поводу MySQL – данная статья поучительная, и на практике такое не применимо. И да, я иногда использую MySQL, помимо PDO, и он не так уж и плох 🙂

В этой статье я покажу как можно написать авторизацию и регистрацию на сайте. Сайт будем писать с нуля.

Итак, зайдите в управление своим сервером (денвер или что-то подобное). Я буду все писать на реальном рабочем сервере. В папке вашего сайта нам необходимо будет создать файл index.php и несколько папок. В итоге иерархия будет такая:
mysite.ru
css
– style.css
include
– header.php
– footer.php
– bd.php
– setting.php
—————————
– index.php

В итоге получаем 2 папки (css и include), индексный файл в корне index.php , 4 файла в папке include и 1 файл в папке css.

Переходим в свой PhpMyAdmin и создаем новую таблицу.

idnamepassworduser_agentipemailtelonline

столбцу id ставим автоинкремент (int), name (varchar), password (varchar), user_agent (varchar), ip (varchar), email (varchar), tel (int), online (int)

Файл header.php

<?php
include "bd.php";
include "setting.php";
# пишем html разметку ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Мой сайт</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
    <link href="../css/style.css" rel="stylesheet">
</head>
<body>
    <div class="container">

Я подключил css библиотеку bootstrap чтобы не отвлекаться на файл стилей.
Пишем подключение к нашей БД

Файл bd.php

<?php
$mysqli = new mysqli("localhost", "имя пользователя", "пароль", "имя БД");
$mysqli->query("SET NAMES 'utf8'");
if (!$mysqli) {
    die('Ошибка соединения: ' . mysqli_connect_errno());
}

Надеюсь, тут все ясно. Заполняем имя пароль для коннекта к БД

Файл footer.php

    </div>
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <script src="//getbootstrap.com/assets/js/ie10-viewport-bug-workaround.js"></script>
</body>
</html><?php
$mysqli->close();
exit;

Пока ничего сложного.

Файл setting.php

<?php
$date = date("d.m.Y");
$t = time();
$adres = $_SERVER['SCRIPT_NAME'];
if (!empty($_COOKIE['log'])):
    $cookie = $_COOKIE['log'];
    $hash = $_COOKIE['id_sess'];
    $log = $mysqli->query("select * from users where name = '$cookie' and password = '$hash' limit 1")->fetch_array(MYSQLI_ASSOC);
else:
    $log = NULL;
    setcookie('log', '');
    setcookie('id_sess', '');
    session_destroy();
endif;
function pr_user() {
    global $log;
    if ($log):
        header("Location: /");
        exit;
    endif;
}
function no_user() {
    global $log;
    if (!$log):
        header("Location: /");
        exit;
    endif;
}
if ($log):
    $get_user = $mysqli->query("select * from users where name = '$log[name]' limit 1");
    $f_user = $get_user->fetch_array(MYSQLI_ASSOC);
    $name = $f_user['name'];
    $id = $f_user['id'];
    $online = $t + 600;
    $mysqli->query("update users set online = '$online' where id = '$id' limit 1");
else:
    
endif;

Файл index.php

Весь код авторизации, регистрации и саму страницу будем писать в одном файле (для ознакомления)

<?php
require ("include/header.php");
@$wer = $_GET['a']; ?>
<div class="row"><?php
switch ($wer)
{
    default:
        if (!$log):
            echo "Онлайн ({$users->num_rows})<br>"; ?><br>
            <a class="btn btn-danger btn-block text-center" href="vhod"> Вход </a>
            <a class="btn btn-danger btn-block text-center" href="reg"> Регистрация </a><br><?php
        else:
            header("Location: menu");
        endif;
        break;
    
    case 'enter':
        pr_user(); ?>
        <div class="col-xs-12"><hr>
            <form action="?a=vh" method="POST">
                <input type="text" name="login"> От 3 символов<br>
                <input type="password" name="pass"> От 5 символов<br>
                <input type="submit" name="enter" class="btn btn-danger btn-block text-center" value="Войти"><br>
            </form>
            <a href="restore">Забыли пароль?</a>
        </div><?php
        break;
    
    case 'vh':
        if (isset($_POST['enter'])):
            $login = $mysqli->real_escape_string(htmlentities($_POST['login'], ENT_HTML5));
            $pass = $mysqli->real_escape_string(htmlentities($_POST['pass'], ENT_HTML5));
            if (empty($login) || trim($login) == "" || strlen($login) < 3):
                $_SESSION['err'] = "Не заполнено поле логин";
                header("Location: ?");
                exit;
            endif;
            if (empty($pass) || trim($pass) == "" || strlen($pass) < 5):
                $_SESSION['err'] = "Не заполнено поле пароль";
                header("Location: ?");
                exit;
            endif;
            $usr = $mysqli->query("select * from users where name = '$login' limit 1")->fetch_array(MYSQLI_ASSOC);
            $hash = $usr['password'];
            $pass_get = password_verify($pass, $hash);
            if ($pass_get == true and $login = $usr['name']) {
                $agent = $_SERVER['HTTP_USER_AGENT'];
                $ip = $_SERVER['REMOTE_ADDR'];
                $mysqli->query("update users set user_agent = '$agent', ip = '$ip' where name = '$login'");
                setcookie("log", $login, time() + 3600 * 48);
                setcookie("id_sess", $hash, time() + 3600 * 48);
                header("Location: menu");
                exit;
            } else {
                pr_user();
            }
        else:
            pr_user();
        endif;
        break;
        
    case 'site':
        no_user(); ?>
        <div class="col-xs-12">
            <p class="text-center">Привет <?= $name ?> ! Это твой первый сайт!</p>
        </div><?
        break;
        
    case 'reg':
        pr_user();
        if (isset($_POST['reg'])):
            $pass = $mysqli->real_escape_string(htmlentities($_POST['pass'], ENT_HTML5));
            $pass2 = $mysqli->real_escape_string(htmlentities($_POST['pass2'], ENT_HTML5));
            $login = $mysqli->real_escape_string(htmlentities($_POST['login'], ENT_HTML5));
            $email = $mysqli->real_escape_string(htmlentities($_POST['email'], ENT_HTML5));
            $tel = $mysqli->real_escape_string(htmlentities($_POST['phone'], ENT_HTML5));
            if ($pass != $pass2):
                $_SESSION['err'] = ("Пароли не совпадают");
                header("Location: ?");
                exit;
            endif;
            if (strlen($_POST['pass']) < 5):
                $_SESSION['err'] = ("Пароль должен быть больше 4 символов");
                header("Location: ?");
                exit;
            endif;
            if (strlen($_POST['login']) < 3):
                $_SESSION['err'] = ("Логин должен быть больше 2 символов");
                header("Location: ?");
                exit;
            endif;
            $reg = $mysqli->query("select * from users where name = '$login' limit 1")->fetch_array(MYSQLI_ASSOC);
            if ($reg['name'] == $login):
                header("Location: ?");
                exit;
            endif;
            if ($reg['email'] == $email):
                header("Location: ?");
                exit;
            endif;
            $agent = $_SERVER['HTTP_USER_AGENT'];
            $ip = $_SERVER['REMOTE_ADDR'];
            $pass = password_hash($pass, PASSWORD_DEFAULT);
            $mysqli->query("insert into users set name = '$login', password = '$pass', email = '$email', tel = '$tel', user_agent = '$agent', ip = '$ip'");
            $_SESSION['info'] = "Необходимо авторизоваться заново";
            header("Location: /");
            exit;
        else: ?>
            <div class="col-xs-12"><hr>
                <form action="reg" method="POST">
                    <input type="text" name="login" required> Введите NickName (От 3 символов)<br>
                    <input type="password" name="pass" required> Введите пароль (От 5 символов)<br>
                    <input type="password" name="pass2" required> Повторите пароль<br>
                    <input type="email" name="email" required> E-mail (Для восстановления)<br>
                    <input type="tel" name="phone" pattern="[0-9]{11}" required> № телефона в формате ХХХХХХХХХХХ (11 цифр без +Х) (Для восстановления)<br>
                    <input type="submit" name="reg" class="btn btn-danger btn-block text-center" value="Регистрация"><br>
                </form>
            </div><?php
        endif;
        break;
        
    case 'res':
        pr_user();
        break;
    case 'exit':
        $log = NULL;
        setcookie('log', '');
        setcookie('id_sess', '');
        session_destroy();
        header("Location: /");
        exit;
        break;

    case 'online':
        no_user(); ?>
        <div class="col-xs-12">
            <h2 class="text-center"></h2>
        </div><?php
        foreach ($users as $on): ?>
            <div class="col-xs-6">
                <a href="user/<?= $on['id'] ?>"><?= $on['name'] ?></a>
            </div>
            <div class="col-xs-6 text-right">
                
            </div><?php
        endforeach;
        break;
} ?>
</div><?php
require ("include/footer.php");

Файл style.css

* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
html {
    background-color: #999;
    min-height: 100vh !important;
}
body {
    max-width: 540px;
    background-color: #888;
    margin: 0px auto;
    color: #fff;
    min-height: 100vh !important;
}
.container {
    width: 100% !important;
}

button, input, optgroup, select, textarea {
    color: #000 !important;
}

Если все сделали правильно, то все должно работать! Немного костыльно и чопорно, но для понимания как сделать простую авторизацию на сайте должно хватить)

Если что не понятно – спрашивайте в комментариях!

Поделиться ссылкой: