это обычная регистрация с активацией после оплаты
такого не существует, т.к. любая регистрация должна сохранять данные на сервере, а используя только js это невозможно
Вид для печати
Помогите, ГУРУ! Делаю сайт для себя (html, css, php, js) с чатом (чат закрытый). Система такова, что на сайте должны быть страницы для (не автоматической) регистрации посетителя (имя, фамилия, emal, пароль-обязательные поля) и восстановления пароля, а другая страница с активацией emal и пароля. Очень прошу, помогите! Очень надо работающий php скрипт и подробная инструкция по установке. Что бы при регистрации все данные шли админу на подтверждение и был виден ip регистрируемого, а при активации пароля был переход на чат. Я убила 9 дней для поиска подходящего скрипта (сама не профи, поэтому написать его не могу), голова кругом, но ничего походящего не нашла. Одна надежда на вас. Помогите, плииииз!
Ау! Люди! Хоть что-нибудь ответьте. Или форум умер?
Запрос в БД
Форма регистрации
[COLOR=#3366ff]CREATE TABLE `users` (
`id` INT( 6 ) NOT NULL AUTO_INCREMENT ,
`nick` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL,
`email` VARCHAR( 50 ) NOT NULL ,
`icq` VARCHAR( 10 ) NOT NULL ,
`avatar` VARCHAR( 50 ) NOT NULL ,
`description` TEXT NOT NULL ,
`town` VARCHAR( 20 ) NOT NULL ,
`site` VARCHAR( 50 ) NOT NULL ,
`uniq_id` VARCHAR( 50 ) NOT NULL ,
`status` INT( 1 ) NOT NULL ,
`last_date` INT( 8 ) NOT NULL ,
`date` INT( 8 ) NOT NULL ,
PRIMARY KEY ( `id` )
) ENGINE = MYISAM[/COLOR]
Наверняка каждый из вас не раз проходил регистрацию и знает как неохота заполнять большое количество полей. Я предлагаю пойти на встречу пользователям и использовать только те данные, которые необходимы для осуществления регистрации: Ник пользователя, адрес электронной почты и пароль. Все остальное (если профиль будет расширенным) мы сможем изменить в личном кабинете.
registration.php
По умолчанию форма регистрации состоит из нескольких полей и изображения кода потверждения. Скрипт простой капчи мы рассматривали недавно, это был урок по отправке почты. Я целиком продублирую фрагмент кода, отвечающего за построение капчи и буду использовать в этом примере.
Стандартно начинаем наш скрипт с подключения необходимых функций и конфигов, а также старта сессии.
<?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 ('Не могу выбрать БД');
В этом фрагменте используем стандартное условие, которое определяет была ли нажата кнопка. Внутри проверяем наличие сессии с именем $_SESSION['uid'] . Если его не существует, генерируем значение функцией mt_rand() в диапазоне от 100000 до 999999. Далее отображаем форму ввода данных и картинку с кодом подтверждения.
if(!$_POST['do'] OR $_POST['do'] =='') {
//Генерируем шестизначный ключ для капчи
if($_SESSION['uid'] =='') { $_SESSION['uid'] = mt_rand(100000,999999); }
//Выводим форму
echo '<html><head><title>Регистрация</title></head><body>';
echo'<form action="" method="POST">';
echo 'Желаемый ник: <input name="nick" type="text" value=""><br/>';
echo 'Пароль: <input name="pass" type="password" value=""><br/>';
echo 'Ещё раз пароль: <input name="rpass" type="password" value=""><br/>';
echo 'Эл.адрес <input name="mail" type="text" value=""><br/>';
echo '<img src="img/capcha.php?sid='.$_SESSION['uid'].'"/> <br/><input name="sid" type="text" value=""><br/><br/>';
echo '<input name="do" type="submit" value="зарегистрировать">';
echo '</form></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>[email protected]</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>';}
}
@mysql_query(»SELECT nick FROM users WHERE nick=’».$nick.»‘»);
ЗАПРОС(»ВЫБРАТЬ nick ИЗ users ГДЕ nick = $nick»);
После выполнения запроса функцией mysql_affected_rows() узнаем количество затронутых рядов. Если в таблице уже есть юзер с таким ником, то мы просто выводим соответсвующее сообщение. Если же совпадения не найдены, переходим к проверке паролей. Ни одно заполняемое поле не должно быть пустым, особенно пароли.
Далее проверяем электронный адрес на валидность. Если условие возвращает TRUE, то переходим непосредственно к регистрации пользователя.
Так как мы используем регистрацию с активацией профиля, нам необходимо сгенерировать уникальный идентификатор пользователя. Он будет состоять из его IP-адреса, типа браузера и значения возвращаемые функцией mk_time(). Склеяв данные в одну строку мы закодируем её функцией md5().
Создаем запрос для записи значений в БД.
Единственное стоит обратить на то какие данные вносятся в БД. Здесь status обязательно равен 0. Далее создаем условие, котрое проверяет результат этого запроса. Если запрос был обработан, необходимо составить сообщение и отправить на введенный электронный адрес ссылку с активацией.
Сообщение компонуем из $subject – темы письма, $message – самого сообщения и заголовков $headers.
$message содержит ссылку, которая ведет на registration.php и передает GET-параметром уникальный идентификатор сгенерированный выше. Что произойдет когда пользователь перейдет по ссылке мы рассмотрим ниже.
Хочу обратить внимание на то что при отправке письма мы не передавали не имя пользователя , ни пароля. Это дополнительная безопасность, которая исключит похищение данных от аккаунта в случае взлома почты или других непредвиденных ситуаций. Поэтому мы будем полностью опираться на уникальный идентификатор пользователя.
//Модуль отвечающий за активацию аккаунта
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 'Активация невозможна: профиль уже активирован';}
}
?>
Создавая запрос мы устанавливаем status равный единице, пользователю у которого соответствующий uniq_id и статус равный нулю. Если запрос был выполнен, выводим сообщение об успешной активации. Теперь юзер может использовать свои данные для авторизации
Авторизация пользователя.
Так как многие от авторизации преследует одну цель, то мы разберем вариант, когда не авторизованный пользователь не имеет доступа к странице.
Сам принцип авторизации достаточно простой и применим к небольшим проектам. Главная особенность – это работа с сессиями, проверка их существования и сверка с данными из БД.
По умолчанию я буду использовать страницу index.php, на которой будет что-либо скрыто.
index.php
Вначале инициализируем сессию, подключаем файл конфигурации и подключаемся к БД MySQL.
<?php
session_start();
//Поключаем конфиг
include("config.inc.php");
//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS)
or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
//Если нет сессийЭтот фрагмент содержит условие, которое особым принципом сверяет сессии содержащие имя пользователя $_SESSION['user'] и пароль $_SESSION['password'] с идентификатором сессии $_SESSION['SID']. Если они не равны переходим к стандартному условию, проверющее действие пользователя, а точнее отправку данных. Если кнопка не была нажата – отображаем форму ввода логина и пароля.
if(md5(crypt($_SESSION['user'],$_SESSION['password'])) != $_SESSION['SID']) {
//Если кнопка не нажата, отображаем форму
if(!$_POST['do']){
echo '<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>';
}
//Если кнопка нажатаКак видите следующий фрагмент производит проверку введенных данных. Далее мы создаем запрос, в котором выбираем все значения где nick= $login и password=$upass и статус РАВНЫЙ 1. Если функция mysql_num_rows вернула значение равное еденице, то это означает что пользователь с такой связкой логин+пароль существует, поэтому мы задаем имя сессий и присваиваем им соответсвующие значения.Далее при помощи функции crypt() задаем $_SESSION['SID']. После этого, уже с ЗАДАННЫМИ сессиями делаем редирект на главную страницу при помощи функции header().
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>';
}
}
md5(crypt($_SESSION['user'],$_SESSION['password'])) == $_SESSION['SID'].
Вначале обязательно проверяем данные переданные в сессиях с данными в базе. Если пользователь произвел активацию, то выводим данные о нем и далее любой произвольный код. Пусть для примера в этом фрагменте будут инклудироваться шаблоны. Чтобы это сделать, создаем условие проверяющее $_GET['page']. Например можно создать ссылку index.php?page=downloads, нажав на которую мы получим в $_GET['page'] значение downloads, следовательно подгружаем шаблон из папки tpl с именем downloads.php
Только в таком варианте строго запрещается инклудировать GET данные напрямую. Создайте дополнительную проверку $_GET['page'].
Если вы заметили, то в предыдущем фрагменте есть ссылочка index.php?exit=1. Если $_GET['exit'] существует, то мы уничтожаем сессию , стираем $_GET['exit'], закрываем соеденение с БД и делаем редирект на главную. Это позволит качественно «отлогиниться».
if($_GET['exit']) {@session_destroy(); unset($_GET['exit']); mysql_close($link); @Header("Location: index.php");}
?>
Шаблоны.
Файлы шаблонов будут лежать в папке tpl на сервере, поэтому не забудьте её создать и поместить в неё шаблон, который грузиться по умолчанию.
default.php
Файл конфигурации.
<?php
echo 'Этот текст будет отображаться по умолчанию.
В шаблоне можно использовать любой код. Все шаблоны должны иметь расширение php';
?>
Файл конфигурации содержит в себе необходимые данные для подключения к БД.
config.inc.php
Файл функций
<?php
//Сервер, в большинстве случаев менять не требуется
$DBSERVER = "localhost";
//Пользователь и пароль
$DBUSER = "root";
$DBPASS = "12345678";//Ваш пароль
//База данных
$DB = "test";
?>
Файл содержит 2 функции. Первая для проверки e-mail’а на корректность, а вторая для отправки почты.
functions.inc.php
Если ты гуру то ты сам переделаешь или поймёшь что и как .
<?php
function checkmail($mail) {
// режем левые символы и крайние пробелы
$mail=trim($mail); // функцию pregtrim() возьмите выше в примере
// если пусто - выход
if (strlen($mail)==0) return -1;
if (!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,2}+([a-z0-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;}
}
?>
СПАСИБО!!! Это я к вам обращалась ГУРУ. Я сама в рядах осликов. ОГРОМНЕЙШОЕ СПАСИБО!!! Буду пробовать!!!
Webmaster, Здравствуйте! Хочу создать базу данных в mysql, кот будет содержать имя и пароль клиентов. как осуществить связь с сайтом. Заранее благодарен!
У меня задача такая: просто осуществить зарегистрированному пользователю доступ к сайту. Я думаю в базе должны быть четыре поля счечик, логин, пароль и реальное имя пользователя.
Подскажите каким методом и где-какой код должен находится., ато я ниче понять не могу
где должна находится сама база данных, вообще иерархию файлов как что и где(если можно).
С уважением, Чайник))
база должна находиться на сервере mySQL (Microsoft SQL, Oracle или каком Вам нравиться). Сервер должен быть либо дан хостером, либо ищите внешний, но заметьте, при внешнем скорость работы будет ниже. При входе на сайт пользователю надо вывести форму для ввода логина и пароля и ссылку для регистрации. После ввода логина и пароля надо обработчиком формы (путь к которому находиться в атрибуте action выведенной формы) проверить есть-ли в базе данных пользоватеть с таким логином и паролем, если есть записать в сессию его реальное имя, если Вы его потом собираетесь где-то вывести на сайте, записать переменную logged = true, которая будет означать, что пользователь вошел, и id этого пользователя из базы данных. при открытии сайта проверять, есть ли в сесии пользователя все эти данные, если нет - форма для входа, если есть - добро пожаловать на сайт.