Выбрать главу

      /* Если активирован задаем значения сессии */

      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.