ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Реализация аутентификации пользователей. Регистрация

Аутентификации пользователей

Модуль аутентификации пользователей содержит четыре главных элемента: регистрацию пользователей, вход и выход из системы, смену паролей и переустановку паролей. Рассмотрим все элементы поочередно.

Регистрация

Чтобы зарегистрировать пользователя, необходимо через форму получить сведения о нем и поместить их в базу данных.

Когда пользователь выполняет щелчок на ссылка Зарегистрироваться, которая находится на странице login.php? для него выводится форма регистрации, сгенерированная сценарием register_form.php. Код этого сцернария смотрите в листинге.

register_form.php — эта форма дает пользователям возможность зарегистрироваться в системе ABCMemori

<?php
require_once('bookmark_fns.php');
$title ="Регистрация пользователей";
$description = "Регистрация пользователей";
$keywords = "регистрация пользователей";
do_html_header($title, $description, $keywords);
blok_left();
?>
<div id="blok_right">
<div class="blok_text" >
<div class="register" align="left">
<?php
do_html_heading($title);
display_registration_form();
?>
</div></div></div>
<?php
do_html_footer();
?>

Эта страница также довольно проста и осуществляет лишь вызов функций из библиотеки вывода — output_ fns.php. Вывод сценария показан на рисунке.

Регистрационная форма извлекает сведения, необходимые для внесения в базу данных. Во избежание ошибок пользователям предлагается ввести пароль два раза

Форма серого цвета на этой странице представляет собой вывод функции display_registration_form(), которая содержится в файле output_fhs.php. Когда пользователь выполняет щелчок на кнопке Регистрация, выполняется сценарий register_new.php, показанный в листинге.

register_new.php — этот сценарий проверяет допустимость вводимой пользователем информации и помещает ее в базу данных

<?php
// Включить файлы функций для данного приложения
require_once('bookmark_fns.php');

// Создать короткие имена переменных
$email=$_POST['email'];
$username=$_POST['username'];
$passwd=$_POST['passwd'];
$passwd2=$_POST['passwd2'];
// Запустить сеанс, который может потребоваться позже.
// Его следует запустить сейчас, поскольку он должен
// находиться перед заголовками.
session_start();

try
{
// Проверить, заполнены ли поля формы
if (!filled_out($_POST))
{
throw new Exception('Вы не заполнили корректно форму. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');
}

// Недопустимый адрес электронной почты
if (!valid_email($email))
{
throw new Exception('Недопустимый адрес электронной почты. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');

}

// Несовпадающие пароли
if ($passwd != $passwd2)
{
throw new Exception('Введенные пароли не совпадают. Пожалуйста, '
.'вернитесь на форму и повторите попытку.');
}

// Проверить длину пароля.
if (strlen($passwd) < 6)
{
throw new Exception('Пароль должен иметь не менее 6 символов. '
.'Пожалуйста, вернитесь на форму и повторите попытку.');

}

// Проверить длину имени пользователя.
if (strlen($username) > 16)
{
throw new Exception('Имя пользователя должно иметь не более 16 символов.'
.' Пожалуйста, вернитесь на форму и повторите попытку.');

}

// Предпринять попытку регистрации. Эта функция также может
// сгенерировать исключение
register($username, $email, $passwd);

// Зарегистрировать переменную сеанса
$_SESSION['valid_user'] = $username;

// Вывести ссылку на страницу, предназначенную для
// зарегистрированных пользователей
$title = "Успешная регистрация";
$description = "Успешная регистрация";
$keywords = "Успешная регистрация";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo '<br><br>';
echo 'Ваша регистрация прошла успешно. Переходите на страницу '
.'для зарегистрированных пользователей '
.'и приступайте к созданию закладок!';
do_html_url('member.php',
'Перейти на страницу для зарегистрированных пользователей');
echo '</div></div></div>';
// Конец страницы
do_html_footer();
}
catch(Exception $e)
{
$title = "Проблема";
$description = "Проблема";
$keywords = "проблема";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo $e->getMessage();
echo '</div></div></div>';
do_html_footer();
exit;
}
?>

Это первый более-менее сложный сценарий, с которым мы встретились в данном приложении. Он начинается с подключения файлов функций и запуска сеанса. (После регистрации пользователя создается переменная сеанса, содержащая имя пользователя, как это было рассмотрено ЗДЕСЬ).

Тело сценария помещено в блок try, поскольку выполняется проверка множества условий. Если какое-то из условий завершается неудачно, выполнение переходит на блок catch, который мы рассмотрим дальше.

Затем осуществляется проверка допустимости данных, введенных пользователем. Нам необходимо выполнить множество проверок:

  • Проверить, что форма полностью заполнена. Для этого применяется функция filled_out ():

    if ( !filled_out ( $_POST ) )

    Эту функцию мы написали самостоятельно. Она содержится в библиотеке data_valid_fns.php и будет рассматриваться чуть позже.

  • Проверка допустимости предоставленного адреса электронной почты:

    if (valid_email ($email))

    Эта функция написана нами и содержится в библиотеке data_valid_fns.php.

  • Проверить эдентичность обоих вариантов пароля, введенных пользователем:

    if ($passwd !+ $passwd2)

  • Проверить имя пользователя и пароль на допустимую длину:

    if (strlen ($passwd) < 6)

    и

    if (strlen ($passwd2) > 16)

    В нашем примере длина пароля должна составлять не менее шести символов, чтобы его было сложнее угадать, но более 16 символов, чтобы он помещался в базе данных. Обратите внимание, что максимальная длина пароля ничем не ограничивается, поскольку в базе данных хранится его кэш-значение SH1, длина которого всегда 40 символов вне зависимости от длины исходного пароля.

Функция filled_out() библиотеки data_valid_fns.php — эта функция проверяет, заполнена ли форма

function filled_out($form_vars)
{
// Проверить, что каждая переменная имеет значение
foreach ($form_vars as $key => $value)
{
if (!isset($key) || ($value == ''))
return false;
}
return true;
}

Функция valid_email() библиотеки data_valid_fns.php — эта функция проверяет допустимость адреса электронной почты

function valid_email($address)
{
// Проверить допустимость адреса электронной почты
if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))
return true;
else
return false;
}

Функция filled_out () ожидает получить массив переменных — в общем случае таковым может быть $_POST или $_GET. Если массив заполнен, функция возвращает true, а в противном случае — false.

В функции valid_email () для проверки адресов электронной почты применяется несколько более сложное регулярное выражение, чем то, которое было предложено ранее. Если адрес является допустимым, функция возвращает значение true, в противном случае — false.

После проверки введенных пользователем данных можно предпринять попытку зарегистрировать пользователя.

register($username, $email, $passwd);</p>

// Зарегистрировать переменную сеанса
$_SESSION['valid_user'] = $username;

// Вывести ссылку на страницу, предназначенную для
// зарегистрированных пользователей
$title = "Успешная регистрация";
$description = "Успешная регистрация";
$keywords = "Успешная регистрация";
do_html_header($title, $description, $keywords);
blok_left();
echo'<div id="blok_right">';
echo '<div class="blok_text">';
echo'<div class="text_top" align=left>';
do_html_heading($title);
echo '<br><br>';
echo 'Ваша регистрация прошла успешно. Переходите на страницу '
.'для зарегистрированных пользователей '
.'и приступайте к созданию закладок!';
do_html_url('member.php',
'Перейти на страницу для зарегистрированных пользователей');
echo '</div></div></div>';
// Конец страницы
do_html_footer();

Несложно заметить, что мы просто вызываем функцию register () и передаем ей имя пользователя, адрес электронной почты и пароль, которые были введены в форме регистрации. В случае успешного исхода мы регистрируем имя пользователя как переменную сеанса и выводим ссылку на главную страницу зарегистрированных пользователей. Если регистрация завершится неудачей, эта функция сгенерирует исключение, которое будет перехвачено блоком catch. Вывод сценария показан на рисунке.

Регистрация прошла успешно - посетитель может перейти на страницу, которая предназначена для зарегистрированных пользователей

Функция register () находится во включенной библиотеке user_auth_fns.php.

Функция register() библиотеки user_auth_fns.php — предпринимает попытку ввода информации о новом пользователе в базу данных

function register($username, $email, $password)
// Регистрирует нового пользователя в базе данных.
// Возвращает либо true, либо сообщение об ошибке.
{
// Подключиться к базе данных
$conn = db_connect();

// Проверить, уникально ли имя пользователя
$result = $conn->query("select * from user where username='$username'");
if (!$result)
throw new Exception('Невозможно выполнить запрос к БД');
if ($result->num_rows > 0)
throw new Exception('Это имя пользователя уже занято - вернитесь '
.'на форму регистрации и выберите другое имя.');

// Если все в порядке, сохранить информацию в БД
$result = $conn->query("insert into user values
('$username', sha1('$password'), '$email')"
);
if (!$result)
throw new Exception('Невозможно сохранение в БД - пожалуйста, '
.'попытайтесь позже.');

return true;
}

Эта функция не содержит ничего нового — она осуществляет подключение к созданной ранее базе данных. Если выбранное имя пользователя уже задействовано либо база данных не может быть обновлена, функция возвращает значение false. В противном случае база данных обновляется и возвращается значение true.

Заметим, что подключение к базе данных реализуется через написанную ранее функцию db_coimect(). Она просто предоставляет единственную область хранения имени пользователя и пароля для подключения к базе данных. Таким образом, для изменения пароля базы данных достаточно модернизировать один файл приложения.

Функция db_connect() библиотеки db_fns.php - выполняет подключение к базе данных MySQL

function db_connect()
{
$result = new mysqli('localhost', 'root', 'tktyf', 'bookmarks');
if (!$result)
throw new Exception('Невозможно подключиться к серверу баз данных');
else
return $result;
}

Зарегистрированные пользователи могут входить и выходить из системы через обычные страницы, предназначенные для этих целей. Они будут разработаны в следующих разделах.