Сайтостроительство (8)

PHP-кодинг (25)

Веб-дизайн (9)

DHTML/JavaScript (8)

Подкастинг (1)

Безопасность в PHP (3)

Секретный раздел

Карта блога

Регистрация пользователей на PHP+MySQL

Скрипт гостевой книги с красивым дизайном

Галерея на jQuery

Простая система регистрации пользователей на сессиях

Форма обратной связи с защитой типа капча

Галерея на php+jquery

Шаблоны запросов и placeholders

Быстрое перенаправление средствами php

Flash плеер для вашего сайта

Сортировка столбцов в таблице на php+mysql

Вызов диалогового окна на javascript

Форматный вывод даты из базы

MySQL и проблемы безопасности

Быстрая смена скина сайта на php

Cистема навигации сайта

За весь период

За 2010-11

За 2009-06

За 2009-05

За 2009-04

За 2009-03

За 2009-02

За 2008-08

Бегун контекстная реклама

Ruseller видеоуроки

Letitbit файлообменник

Tak.Ru $$$ вебмастеру

WMmail почтовые рассылки

WMlink продажа трафика

Sape.Ru продажа ссылок

Главная » PHP-кодинг

Простая система регистрации пользователей на сессиях

Для реализации данной системы нам понадобиться создать таблицу в базе данных и написать 3 скрипта:

  1. сonfig_reg.php - конфигурация вашей базы (соединение с существующей бд и проверка на её существование с выводом соответствующих ошибок)
  2. block_loginbox.php - блок интерфейса или входа.
  3. member.php - главный файл-скрипт, отвечающий за саму регистрацию, обработчики форм и вывод информации по аккаунту пользователя.

Эти три файла нужно разместить у себя в корневом каталоге веб-сайта.

Итак, создадим таблицу в вашей БД для хранения данных о пользователе. Воспользуемся стандартными средствами phpMyAdmin для создания таблицы, выполнив следующий SQL-запрос:


SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
-- 
-- Структура таблицы `users`
-- 
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(250) NOT NULL,
  `password` varchar(250) NOT NULL,
  `email` varchar(250) NOT NULL,
  PRIMARY KEY  (`id`)
);
-- 
-- Дамп данных таблицы `users`
-- 
INSERT INTO `users` VALUES (1, 'admin', 
'admin', 'admin@mail.ru');

где,
id - идентификатор пользователя(певичный ключ)
username - имя пользователя(логин)
password - пароль пользователя
email - электронный адрес пользователя

Далее создаём файл конфигурации config_reg.
если текущей базы данных у вас на сайте нет, то пропишите настройки соединения прямо в этом файле, либо иначе просто вставьте ваш файл настройки с помощью инструкции "include". То есть в файле config_reg.php отредактируйте строчку 3, где прописано соединение с базой данных на вашу базу если имя файла отличается, от приведенного в примере. Также можно вообще не использовать этот файл, а просто занести его содержимое в ваш файл настроек соединения с БД, в данном случае bd.php, после чего не забудьте перенести вставку include("blocks/bd.php"); из этого скрипта - в скрипт member.php, заменив соответствующую строчку с упоминанием уже ненужного include("config_reg.php");


<? 
session_start(); //стартуем сессию
include ("blocks/bd.php");//соединение с БД
/*нижеследующие проверки необязательны,
если ваша база правильно создана и данные 
в таблице
существуют в правильной кодировке*/
if(!$db)
{
	echo "".mysql_errno()." ".mysql_error()."\n";
	echo "<br>Нет подключения к базе данных.";
	exit;
}
else
{
	if(!$db_name) {
	echo "".mysql_errno()." ".mysql_error()."\n";
	echo "<br>База данных не существует!";
	exit;
}
else {
$guery_charset = mysql_query("SET NAMES 
$mysql[db_charset]");}
}
?>

Блок входа в аккаунт лучше всего разместить на главной страничке вашего сайта, то есть в вашем статическом шаблоне, в котором вы храните например пенель навигации вашего сайта. Вставить его можно с помощью конструкции вида: include("block_loginbox.php");


<?
// блок входа или интерфейса.
if($_SESSION["loged"] == "yes") // Если вошли приравняли  (вошли = да)
{
	?>
	<p align="center">Здравствуйте, <b><? echo $_SESSION["username"]; ?></b>!</p>
<!-- СЮДА МОЖНА ВЫВОДИТЬ АВАТАР (ЭТО РЕАЛИЗУЮ В СЛЕДУЮЩЕЙ ВЕРСИИ) -->
<p><a href="member.php?do=editaccount">Редактировать профиль</a><BR>
<a href="member.php?do=changepass">Изменить Пароль</a><BR>
<a href="member.php?do=logout">Завершить сеанс</a></p> <form action="member.php?do=login" method="post">
<table align="center" cellpadding="4" cellspacing="0" border="0" style="font-size:11px">
<tr><td>Логин:</td><td><input type="text" name="username" size="12"></td></tr>
<tr><td>Пароль:</td><td><input type="password" name="password" size="12"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" value="Войти"></td></tr>
</table>
</form>
<p class='reg'><a href="member.php?do=register">Регистрация</a> / <a href="member.php?do=lostpass">Забыли пароль?</a></p>
<? } ?>

И наконец создаем главный файл, отвечающий за регистрацию. Всё действия производятся исключительно в одном файле (вход/выход/редактирование), каждое действие опознается через метод GET(метод передачи данных через адресную строку для запроса содержимого указанного ресурса, параметры выполнения запроса передаются в URI после символа «?»)

Привожу полный листинг данного файла с комментариями. Затем дам краткое описнаие принципа работы.


<?
// подключаем БД и стартуем сессию
include("config_reg.php");
if (!preg_match("|^[\D]+$|", $_GET['do']))
{
	exit ("Неверный формат запроса! Проверьте URL!");
}
//подключаем блоки
include ("blocks/header.php"); //ВАША ШАПКА САЙТА
include ("blocks/lefttd.php"); //ЛЕВОЕ МЕНЮ САЙТА
include ("blocks/nav.php"); //ПАНЕЛЬ ВЕРХНЕЙ НАВИГАЦИИ САЙТА
echo "<link rel='stylesheet' href='style.css'>";
//ФАЙЛ СТИЛЕЙ // начинаем регистрацию если $_GET['do'] == "register" if($_GET['do'] == "register") { // Сразуже проверим вошел ли польхователь или нет. if($_SESSION["loged"] == "yes") { echo "Вы уже вошли. Для новой регистрации выйдите!"; } else { //ниже формочка методом post ссылающаяся на етотже файл но со значением ?do=reg ?> <form action="member.php?do=reg" method="post"><br>
<table width="95%" align="center" cellpadding="4" cellspacing="0" border="0" class="gf">
<tr><td colspan="2" align="center" class="nav_title">Регистрация пользователя</td></tr>
<tr><td align="right">Имя пользователя:</td><td><input type="text" name="username"></td></tr>
<tr><td align="right">Пароль:</td><td><input type="password" name="password"></td></tr>
<tr><td align="right">Повторите пароль:</td><td><input type="password" name="password2"></td></tr>
<tr><td align="right">Ваш E-Mail:</td><td><input type="text" name="emaila"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" value="Зарегистрироваться"></td></tr>
</table>
</form>
<?
} } // заканчиваем резистрацию если ?do=reg переход от формочки. if($_GET['do'] == "reg") { $username = trim($_POST["username"]); $password = trim($_POST["password"]); $password2 = trim($_POST["password2"]); $emaila = trim($_POST["emaila"]); // проверим в базе есть ли такой пользователь как мы хочем зарегистрировать $result = mysql_query("SELECT * FROM users where username='$username'", $db); $exuser=mysql_numrows($result); if($username=='' OR $password=='' OR $password2=='' OR $emaila=='') { echo "Заполните пожалуйста все поля!"; } if ($username == '') { echo("Поле 'Логин' не заполнено"); // Логин может состоять из букв, цифр и подчеркивания } elseif (!preg_match("/^\w{3,}$/", $username)) { echo("В поле 'Логин' введены недопустимые символы"); } if ($emaila == '') { echo("Поле 'E-mail' не заполнено"); }// Проверяем e-mail на корректность elseif (!preg_match("/^[a-zA-Z0-9_\.\-]+@([a-zA-Z0-9\-]+\.)+[a-zA-Z]{2,6}$/", $emaila)) { echo("Указанный 'E-mail' имеет недопустимый формат"); } if ($password == '' || $password2 == '') { echo("Поле 'Пароль' не заполнено"); } // Пароль может состоять из букв, цифр и подчеркивания elseif(!preg_match("/^\w{3,}$/", $password)) { echo("В поле 'Пароль' введены недопустимые символы"); } elseif($password!=$password2) { echo "Пароли не совпадают!"; } elseif($exuser=='1') { echo "Имя пользователя $username уже зарегистрировано! Придумайте другое"; } else { $mdPassword = md5($password); // если всё удачно то внесем в базу пользователя. $query = "INSERT INTO users (`username`,`password`,`email`)"."VALUES ('$username', '$mdPassword', '$emaila')"; $result = mysql_query($query, $db); echo ">Спасибо за регистрацию!
Теперь вы можете войти в свой аккаунт!"; } } // начнем востанавливать пароль, формочка if($_GET['do'] == "lostpass") { echo "<form action='member.php?do=lostpassword' method='post'><br>";
echo '<table width="95%" align="center" cellpadding="4" cellspacing="0" border="0" class="gf">';
echo '<tr><td colspan="2" align="center" class="nav_title">Восстановление пароля</td></tr>';
echo "<tr><td align='right'>Имя пользователя:</td><td><input type='text' name='user' size='16'></td></tr>";
echo "<tr><td>&nbsp;</td><td><input type='submit' value='Выслать пароль'></td></tr></table></form>";
} // восстанавливаем. if($_GET['do'] == "lostpassword") { if($_SESSION["loged"] == "yes") { echo "Вы уже в системе"; } else { // запросим данные с базы $user = $_POST["user"]; $result = mysql_query("SELECT * FROM users where username='$user'", $db); $chck_db=mysql_numrows($result); if ($user == "") { echo "Введите имя пользователя!"; } else { if($chck_db=='0') { echo "Пользователь c таким логином не существует!"; } else { // тут создадим письмо. $subject = "Забытый Пароль"; $body = "Ваш пароль для сайта: ".$password.""; $sql_query = "SELECT email FROM users where username='$user'"; $result = mysql_query($sql_query); while ($row = mysql_fetch_array($result)) { $address = $row[0]; @mail($address ,$subject , $body); echo "Ваш пароль отправлен на E-mail введенный при регистрации: ".$address.""; } } } } } // начинаем смену пароля if($_GET['do'] == "changepass") { if($_SESSION["loged"] == "yes") { ?> <form action="member.php?do=changepassword" method="post"><br>
<table width="95%" align="center" cellpadding="4" cellspacing="0" border="0" class="gf">
<tr><td colspan="2" align="center" class="nav_title">Изменение пароля</td></tr>
<tr><td align="right">Старый пароль:</td><td><input type="password" name="oldpass"></td></tr>
<tr><td align="right">Пароль:</td><td><input type="password" name="newpass"></td></tr>
<tr><td align="right">Повторите пароль:</td><td><input type="password" name="newpassagain"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" value="Изменить"></td></tr>
</table>
</form>
<?
} else { echo "Вы должны войти в аккаунт!"; } } // Продолжаем смену пароля if($_GET['do'] == "changepassword") { if($_SESSION["loged"] == "yes") { // берем даныые по переменной сессии пользователя $result = mysql_query("SELECT * FROM users where username='{$_SESSION["username"]}'", $db); $rows = mysql_fetch_array($result); $pass = $rows["password"]; $oldpass = trim($_POST["oldpass"]); $newpass = trim($_POST["newpass"]); $newpassagain = trim($_POST["newpassagain"]); if($newpass=='' OR $newpassagain=='' OR $oldpass=='') { echo "Введите пароли"; } elseif(!preg_match("/^\w{3,}$/", $newpass)) { echo("В поле 'Пароль' введены недопустимые символы"); } elseif($newpass!=$newpassagain) { echo "Новые пароли несовпадают!"; } elseif($pass != md5($oldpass)) { echo "Старый пароль неверный!"; } else { $mdnewpass = md5($newpass); mysql_query("update users set password='$mdnewpass' where username='{$_SESSION["username"]}'"); echo "Пароль успешно изменен!"; } } else { echo "Вы должны войти в аккаунт!"; } } //Начинаем редактировать аккаунт if($_GET['do'] == "editaccount") { if($_SESSION["loged"] == "yes") { $sql_query = "SELECT * FROM users where username='{$_SESSION["username"]}'"; $result = mysql_query($sql_query); $row = mysql_fetch_array($result); $email = $row[email]; ?>
<form action="member.php?do=edit_account" method="post"><br>
<table width="95%" align="center" cellpadding="4" cellspacing="0" border="0" class="gf">
<tr><td colspan="2" align="center" class="nav_title">Редактирование профиля</td></tr>
<tr><td align="right">Имя пользователя:</td><td><input type="text" disabled name="username" value="<? echo $_SESSION["username"];?>"></td></tr>
<tr><td align="right">Ваш E-Mail:</td><td><input type="text" name="emaila" value="<?php echo $email ?>"></td></tr>
<tr><td>&nbsp;</td><td><input type="submit" value="Изменить данные"></td></tr>
</table>
</form>
<?
} else { echo "Вы должны войти в аккаунт!"; } } // Заканчиваем редактировать аккаунт if($_GET['do'] == "edit_account") { if($_SESSION["loged"] != "yes") { echo "Вы должны войти в аккаунт!"; } elseif($_POST["emaila"]=='') { echo "Заполните все обязательные поля!"; } else { // изменим данные в базе $query = mysql_query("select * from users where username='{$_SESSION["username"]}'"); $row = mysql_fetch_array($query); mysql_query("update users set email='$_POST[emaila]' where username='{$_SESSION["username"]}'"); echo "Информация изменена"; } } // Вход if($_GET['do'] == "login") { $username = trim($_POST["username"]); $password = trim($_POST["password"]); if($username=='' OR $password=='' OR ($username=='' AND $password=='')) { echo "Вход не осуществлен!
Вы не ввели логин или пароль!"; } else { if($_SESSION["loged"] == "yes") { echo "Вы уже в системе!"; } else { $result = mysql_query("SELECT * FROM users where username='$username'", $db); $rows = mysql_fetch_array($result); $pass = $rows["password"]; // Если пароли совпали то создами переменные сессии (вход да) и (имя пользователя) if($pass == md5($password)) { $_SESSION["loged"] = "yes"; $_SESSION["username"] = "$username"; echo "Вход осуществлен!"; echo <<<HTML
<SCRIPT LANGUAGE="javascript">
window.location.href = "index.php"
</SCRIPT>
HTML; } else { echo "Неверный пароль!"; } } } } //Выход if($_GET['do'] == "logout") { // Для выхода вам всеголиш нужно уничтожить переменные. Уничтожаются также как и обычные переменные unset($_SESSION["loged"]); unset($_SESSION["username"]); echo "Вы успешно вышли!"; echo "
"; //Обновим страничку автоматом для того чтобы обновился блок входа. echo <<<HTML
<SCRIPT LANGUAGE="javascript">
window.location.href = "index.php"
</SCRIPT>
HTML; } include ("blocks/righttd.php"); //ПРАВАЯ ПАНЕЛЬ САЙТА include ("blocks/footer.php"); //ФУТЕР(ПОДВАЛ САЙТА) ?>

ПРИНЦИП РАБОТЫ:
Допустим мы входим. Вводим данные логин и пароль в форме и через метод POST передаём обрабатывающему скрипту. Дальше соединяемся с базой, проверяем совпадает ли пароль, если совпадает, то создаем 2 переменных сессии: $_SESSION["loged"] и $_SESSION["username"] Первая будет проверять осуществлен ли вход, а вторая имя пользователя. Теперь вы можете везде пользоваться этими данными. Они будут отображаться( в частности - логин) на панели вашего аккаунта вместе с ссылками для управления аккаунтом. Для опознания "вошел ли пользователь или нет?" приравниваем $_SESSION["loged"] = "yes" (вошли = да). Вот и всё.

Скачать демо-версию скрипта Простая система регистрации пользователей на сессиях

А теперь несколько слов о приминении данного скрипта на вашем сайте:
Допустим вам надо ограничить на сайте доступ к определенной части скрипта, например к форме добавления комментария или к гостевой книге.
первое, что надо сделать - это стартовать сессию:
Самой первой строчкой в каждом скрипте, защищаемом авторизацией прописать строчку:

session_start();

И для того, чтобы ограничить возможности обычного пользователя, например путем скрытия какого-либо элемента на страничке, нужно тот, кусок кода, который вам нужно защитить, поместить в следующую конструкцию:


if($_SESSION["loged"] == "yes")
{
 /*тут ваш код защищенной информации,
например 
вывод формы добавления комментария с
обработкой и обновлением информации в
базе*/
	if (!isset($sub_com))
	{	
	?>
	<h3>Добавить Ваш комментарий:</h3>
	<form action="<?=$_SERVER['REQUEST_URI']?>" 
method="post" name="form_com">
		....
		</form><br>
  <?}
	else
	{
	/*обработка введенных записей*/
			...
	/* обрабатываем сообщение */
			....
	/* запрос на выборку поля суммы */
			...
		$myrow = mysql_fetch_array($result);

		if ($pr == $myrow["sum"])
		{
			...
		}
		else 
		{
			exit;
		}
	}
}
else
{
	echo "Зарегистрируйтесь, чтобы иметь 
возможность добавлять комментарии";
}

А чтобы например для зарегеного пользователя не отображать поле для ввода имени, нужно сделать следующее:
В форме цикле добавления комментария заменить SQL-запрос. Привожу прям кусок кода с проверкой (пример взят с движка блога из видеоуроков Евгения Попова):


...
if ($pr == $myrow["sum"])//проверка суммы
{
	$date = date("Y-m-d");
	
	$result2 = mysql_query ("INSERT INTO comments 
(post,author,text,date)
VALUES ('$id','$_SESSION
[username]','$text','$date')",$db);
	...
	...
}

То есть на место переменной $author, мы подставили значение сессионной переменной $_SESSION[username] текущего зарегестрированного пользователя.

Все предоставлено в данных листингах вместе с дизайном (в частности формочки веб-форм оформлены в html-таблички), а подписать ваши стили будет очень легко и не составит большого труда. Если что, спрашивайте!
Данная версия скрипта распространяеся как есть, буду рад, если предложите нововведения. Остальные функции и возможные улучшения реализую в следующих версиях.

Удачного вам изучения!
С уважением, dima

Комментировать

Автор: admin | Добавлена: 24.03.2009 | Просмотров: 23784
Рейтинг: 133 | Голосов: 31

Оцените заметку: 1 2 3 4 5

Последние обновления в категории: PHP-кодинг

Комментарии (0)

Комментариев пока нет!

Только авторизованные пользователи могут добавлять комментарии. Зарегистрироваться.

Логин:
Пароль:
 

Регистрация

: Тема:

Заметок в базе: 56
Комментариев: 0
Всего юзеров: 114
Сейчас онлайн: 1