Сразу отвечу на гневные реплики по поводу 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 и создаем новую таблицу.
id | name | password | user_agent | ip | tel | online |
столбцу 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;
}
Если все сделали правильно, то все должно работать! Немного костыльно и чопорно, но для понимания как сделать простую авторизацию на сайте должно хватить)
Если что не понятно – спрашивайте в комментариях!