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

PHP-кодинг (25)

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

DHTML/JavaScript (8)

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

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

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

Карта блога

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

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

Галерея на jQuery

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

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

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

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

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

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

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

Добавляем списки выбора в форму регистрации

Язык разметки XHTML

История развития Всемирной паутины

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

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

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

За 2010-11

За 2009-06

За 2009-05

За 2009-04

За 2009-03

За 2009-02

За 2008-08

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

Ruseller видеоуроки

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

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

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

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

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

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

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

Для начала нам потребуется создать базу данных с таблицей `users` На языке SQL таблица будет выглядеть следующим образом:


-- 
-- Структура таблицы `users`
-- 
CREATE TABLE `users` (
  `id` int(6) NOT NULL auto_increment,
  `nick` varchar(30) NOT NULL default '',
  `password` varchar(50) NOT NULL default '',
  `email` varchar(50) NOT NULL default '',
  `uniq_id` varchar(50) NOT NULL default '',
  `status` int(1) NOT NULL default '0',
  `last_date` int(8) NOT NULL default '0',
  `date` int(8) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Где,
id - идентификатор записи(первичный ключ),
nick - имя пользователя(никнэйм),
password - пароль пользователя,
email - электронный адрес пользователя,
uniq_id - уникальный идентификатор сессии
status - статус пользователя (0/1, зарегеный/незарегеный),
last_date - последняя дата пребывания,
date - дата регистрации

Базу создаем с помощью стандартных средств(SQL-запрос) утилиты phpMyAdmin, входящей в состав пакета программ Денвер

Затем определяем файловый состав проектируемой системы. Нам понадобиться 4 файла и 2 папки:
config.inc.php - файл конфигурации (настройки соединения с БД)
functions.inc.php - функция проверки и отправки регистрационных данных на email-пользователя
registration.php - форма регистрации
index.php - главный файл с формой аутентификации пользователя, отображением его статуса и выводом файла-шаблона зарегестрированного пользователя (если таковым он является).
img/ - папка с изображениями антиспам-защиты(капча)
tpl/ - папка с php-шаблоном(default.php) зарегестированного пользователя.

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

config.inc.php
<?
//Данные для работы с MySQL
//Сервер, в большинстве случаев менять не требуется
$DBSERVER = "localhost";
//Пользователь и пароль
$DBUSER = "root";
$DBPASS = "";
//База данных
$DB = "test_reg";
?>
functions.inc.php
<?
//проверка емайла на валидность
function checkmail($mail) {
   // режем левые символы и крайние пробелы
   $mail=trim($mail);
   // если пусто - выход
   if (strlen($mail)==0) return -1;
   if (!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,2}+([a-z
0-9_-]){0,5}@(([a-z0-9-]+\.)+(com|net|org|mil|".
   "edu|gov|arpa|info|biz|inc|name|
[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-".
   "9]{1,3}\.[0-9]{1,3})$/is",$mail))
   return -1;
   return $mail;
}
//отправка почты
function sendmail($mail,$subject,$message,$headers)
{
	if(mail($mail,$subject,$message,$headers))
{ return TRUE;}
	else {return FALSE;}
}
?>
registration.php

<?
session_start();
@include("config.inc.php");
@include("functions.inc.php");
 //Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');

if(!$_POST['do'] OR $_POST['do'] =='') {
//Генерируем шестизначный ключ для капчи
if($_SESSION['uid'] =='') { $_SESSION['uid'] = mt_rand(100000,999999); }

//Выводим форму
echo '<html><head><title>Регистрация</title></head><body>';
echo '<h2>Форма регистрации</h2>';
echo'<form action="" method="POST"><table cellpadding=4 cellspacing=0 border=1 style="border-collapse:collapse">';
echo '<tr><td>Желаемый ник:</td><td><input name="nick" type="text" value=""></td></tr>';
echo '<tr><td>Пароль:</td><td><input name="pass" type="password" value=""></td></tr>';
echo '<tr><td>Ещё раз пароль:</td><td><input name="rpass" type="password" value=""></td></tr>';
echo '<tr><td>Эл.адрес</td><td><input name="mail" type="text" value=""></td></tr>';
echo '<tr align="center"><td colspan=2><img src="img/capcha.php?sid='.$_SESSION['uid'].'"/><br/><input name="sid" type="text" value=""></td></tr>';
echo '<tr><td colspan=2 align="right"><input name="do" type="submit" value="зарегистрировать"></td></tr>';
echo '</table></form><a href="./">« Назад</a></body></html>';
}
//Если данные отправлены
if($_POST['do'] !='') {
//Начинаем проверять входящие данные
if($_POST['sid'] == $_SESSION['uid']) {

//Создаем запрос к базе для проверки существования Пользователя
$nick = $_POST['nick'];
mysql_query("SELECT * FROM users WHERE nick='".strtolower($nick)."'");

//Проверка результата запроса
if(mysql_affected_rows()==0) {
//Проверка ввведенных паролей

if($_POST['pass'] !='' AND $_POST['rpass'] !='' AND $_POST['pass'] === $_POST['rpass']){
//Проверяем на валидность электронный адрес
if(checkmail($_POST['mail']) !== -1) {

//Осуществляем регистарацию
//Генерируем uniq_id
$uniq_id = md5($_SERVER['REMOTE_ADDR'].$_SERVER['HTTP_USER_AGENT'].mktime());
$pass = $_POST['pass'];
$email = $_POST['mail'];
//Создаем запрос для записи данных в БД
$r = @mysql_query("INSERT INTO users VALUES(NULL,'".strtolower($nick)."','".md5($pass)."','".$email."','".$uniq_id."',0,'".date("dmY")."','".date("dmY")."')");

//После запроса отправляем письмо юзеру, для активации аккаунта
if($r) {
// Для отправки e-mail в виде HTML устанавливаем необходимый mime-тип и кодировку
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";
// Откуда пришло
$headers .= 'From:Сайт %sitename%' . "\r\n";
//Здесь укажите электронный адрес, куда будут уходить сообщения
$mailto = $email;
$subject = "Подтверждение регистарции на сайте";
$message = 'Для активации аккаунта пройдите по следующей ссылке <a href="http://АДРЕС_САЙТА/registration.php?
activation='.$uniq_id.'" target="_blank">http://АДРЕС_САЙТА/registration.php?activation='.$uniq_id.'</a>';
$message .= 'или скопируйте ссылку в окно ввода адреса браузера и нажмите enter.';
//Отправляем сообщение
if(sendmail($mailto,$subject,$message,$headers) !== FALSE) {
echo 'Регистрация завершена, на введеный Вами e-mail было отправлено сообщение для активации аккаунта';
}
else {echo 'Регистрация невозможна: Повторите запрос позднее';}
                       }
                       else {echo 'Регистрация невозможна: Повторите запрос позднее';}
                 }
                 else {echo 'Регистрация невозможна: Электронный адрес должен соответствовать шаблону <b>name@domen.com</b><br/><a

href="registration.php"/>назад</a>';}

             }
             else {echo 'Регистрация невозможна: Введенные пароли не совпадают<br/><a href="registration.php"/>назад</a>';}


           }
           else { echo 'Регистрация невозможна: Пользователь с таким именем уже существует<br/><a href="registration.php"/>назад</a>';}


         session_destroy();
        }
        else { echo 'Регистрация невозможна: код подтверждения введен не верно<br/><a href="registration.php"/>назад</a>';}
     }
     //Модуль отвечающий за активацию аккаунта

     if($_GET['activation'] AND $_GET['activation']!='') {
     $uniq_id = $_GET['activation'];
     //Создаем запрос
     $r=@mysql_query("UPDATE users SET status=1 WHERE uniq_id='".$uniq_id."' AND status=0");
     if($r) {echo '<h2>Ваша учетная запись активирована.</h2><br/> Теперь вы можете <a href="index.php">войти на сайт</a> используя данные указанные при регистрации';}
     else {echo 'Активация невозможна: профиль уже активирован';}
     }
?>
index.php
<?
session_start();
//Поключаем конфиг
include("config.inc.php");
//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
//Если нет сессий
if(md5(crypt($_SESSION['user'],$_SESSION['password'])) != $_SESSION['SID']) {
 //Если кнопка не нажата, отображаем форму
if(!$_POST['do']){

echo '
<a href="registration.php">регистрация</a> <br/><br/>
<form name="1" action="" method="post">
     <input name="login" type="text" value=""> <br/>
     <input name="password" type="password" value="">  <br/>
     <input name="do" type="submit" value="Войти">
</form>';
}
//Если кнопка нажата
if($_POST['do']) {
//Проверяем данные
$login = $_POST['login'];
$upass = $_POST['password'];
if($login !='' AND $upass !='') {
//Создаем запрос
$q1=mysql_query("SELECT * FROM users WHERE nick='".$login."' AND password='".md5($upass)."' AND status=1");
//Проверяем существует ли хоть одна запись
if(mysql_num_rows($q1)===1) {
//Если есть, то создаем сессии и перенаправляем на эту страницу
$r=mysql_fetch_array($q1);
$_SESSION['user'] = $r['nick'];
$_SESSION['password'] = $r['password'];

$_SESSION['SID'] = md5(crypt($r['nick'],$r['password']));
@Header("Location: index.php");
}
else {echo 'Неверный логин/пароль; Возможно Ваш аккаунт не активирован';}
}
}
else {echo 'Введите данные';}
}
else {

   $q2 = @mysql_query("SELECT * FROM users WHERE nick='".$_SESSION['user']."' AND password='".$_SESSION['password']."' AND status=1");
if(@mysql_num_rows($q2)==1){
   $r2 = @mysql_fetch_array($q2);

   echo 'Вы: '.ucfirst($r2['nick']).'<br/>';
echo '<a href="index.php">главная</a>   ';
echo '<a href="index.php?page=downloads">загрузки</a><br/>';

if($_GET['page'] !='') {
@include("tpl/".$_GET['page'].".php");
}
else { @include("tpl/default.php");}



   echo '<br/><br/><a href="index.php?exit=1">выход</a>';
}
   }
  if($_GET['exit']) {@session_destroy(); unset($_GET['exit']); mysql_close($link);   @Header("Location: index.php");}
?>

Принцип работы аутентификации основан на проверке существования в сессионных переменных значений, введенных пользователем при регистрации. Если при аутентификации на странице index.php эти данные совпадают со значениями, извлекаемыми из таблицы `users`, то направляем пользователя на защищенную страницу, в данном случае на default.php. Вот и всё.

Скрины к этому уроку:
1) главная страница с приглашением к аутентификации и ссылкой на регистрацию
2) форма регистрации c защитой типа капча
3) защищенная страница c пользовательской информацией и ссылкой "выход"


Если не получается, то вот вам готовый скрипт этого урока:
Скачать скрипт регистрации

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

Автор: admin | Добавлена: 16.03.2009 | Просмотров: 102883
Рейтинг: 928 | Голосов: 202

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

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

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

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

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

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

Регистрация

: Тема:

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