/* Если активирован задаем значения сессии */
if(session_id() == '') {session_start();}
$_SESSION['loggedIn'] = TRUE;
$_SESSION['login'] = $_POST['login'];
$_SESSION['password'] = $password;
return TRUE;
}
else
{
if(session_id() == '') {session_start();}
unset($_SESSION['loggedIn']);
unset($_SESSION['login']);
unset($_SESSION['password']);
$GLOBALS['loginError'] =
'Указанный логин или password не совпадают.';
return FALSE;
}
}
if (isset($_POST['action']) and $_POST['action'] == 'logout')
{
if(session_id() == '') {session_start();}
unset($_SESSION['loggedIn']);
unset($_SESSION['login']);
unset($_SESSION['password']);
unset($_SESSION['userid']);
header('Location: ' . $_POST['goto']);
exit();
}
if(session_id() == '') {session_start();}
if (isset($_SESSION['loggedIn']))
{
return databaseContainsAuthor($_SESSION['login'], $_SESSION['password']);
}
}
/* Функция проверяет наличие в БД пользователя с переданной парой логин – пароль */
function databaseContainsAuthor($login, $password)
{
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
try
{
$sql = 'SELECT COUNT(*) FROM users WHERE login = :login AND password = :password';
$s = $dsn->prepare($sql);
$s->bindValue(':login', $login);
$s->bindValue(':password', $password);
$s->execute();
}
catch (PDOException $e)
{
echo $e->getMessage();
exit();
}
$row = $s->fetch();
if ($row[0] > 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
/* Права для пользователя */
function userHasRole($role)
{
include $_SERVER['DOCUMENT_ROOT'].'/chat/dsn.php';
if (isset($_SESSION['login'])) {
try
{
$sql = "SELECT COUNT(*) FROM users
INNER JOIN authorrole ON users.id = authorid
INNER JOIN role ON roleid = role.id
WHERE login = :login AND role.id = :roleId";
$s = $dsn->prepare($sql);
$s->bindValue(':login', $_SESSION['login']);
$s->bindValue(':roleId', $role);
$s->execute();
}
catch (PDOException $e)
{
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка поиска прав пользователя');
}
$row = $s->fetch();
if ($row[0] > 0)
{
return TRUE;
}
else
{
return FALSE;
}
}
}
/* Определяем id пользователя */
function userId() {
if (isset($_SESSION['login'])) {
try {
include $_SERVER['DOCUMENT_ROOT'].'/dsn.php';
$sql = 'SELECT id FROM users WHERE login = :login';
$s = $dsn->prepare($sql);
$s->bindValue(':login',$_SESSION['login']);
$s->execute();
$rowid=$s->fetch();
$_SESSION['userid'] = $rowid['id'];
}
catch (PDOException $e) {
echo $e->getMessage();
echo $e->getLine();
exit('Ошибка добавления пользователя');
}
}
}
Файл содержит функции для проверки данных пользователя.
Функция userIsLoggedIn()проверяет наличие и правильность данных переданных формой авторизации, активациию пользователя. В зависимости от результатов проверки этих данных устанавливает или уничтожает значения переменных сессии $_SESSION. Возвращает «true» или «false».
Для активации пользователя используется $activation. Пользователь считается активированным, если $activation = 1. Проверяем запросом к БД для указанного логина.
Функция databaseContainsAuthor() проверяет наличие в БД пользователя с переданной парой логин – пароль. Если пользователь существует возвращает «true» если нет «false».
Функция userHasRole($role)определяет уровень пользователя: «admin» или «user». В качестве параметра передается значение $role. Если $role равна значению «id» таблицы «role» установленному для данного логина при авторизации, то возвращает значение «true» иначе «false».
Функция userId() определяет «id» пользователя. Устанавливает значение переменной сессии $_SESSION['userid'].
9.1.3 Форма авторизации
Форма авторизации «form_login.php» служит для ввода логина и пароля пользователя.
Листинг 14. form_login.php Путь: /news/chat/admin/ form_login.php
<?php include_once $_SERVER['DOCUMENT_ROOT'].'/chat/admin/clean.php'; ?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="/chat/style.css" />
<title>Авторизация</title>
</head>
<body>
<?php if (isset($loginError)): ?>
<p><?php htmlout($loginError); ?></p>
<?php endif; ?>
<form action="" method="post" class="chatform">
<h4 class="formname">Авторизация</h4>
<hr>
<div class="login_input">
<label for="email">Логин:
<input type="text" name="login" id="login" class="inputs">
</label>
</div>
<hr>
<div>
<label for="password">Пароль:
<input type="password" name="password" id="password">
</label>
</div>
<hr>
<div>
<input type="hidden" name="action" value="out">
<input type="submit" value="Отправить">
</div>
</form>
</body>
</html>
В самом начале файла вставляем скрипт «clean.php», который будет чистить получаемые данные ($loginError).
Выводим форму. Заполняем, отправляем данные.
9.1.4 Страница ошибки активации
Страница ошибка активации erroractivation.html. Форма будет вставляться в случае ошибки активации, а именно, если переменная активации не равна 1:
$activation != 1;
проверка ведется в скрипте access.php.