Доброго времени суток, уважаемые. Сегодня, как я и обещал, реализуем обработчик формы регистрации для сайта на php. Хочу напомнить, что это продолжение публикации по созданию формы регистрации для своего сайта. Много говорить не будем, а немного вспомним, как мы создавали скрытый блок div для вывода ошибок ввода в поля формы. Так вот, давайте для начала и реализуем скрипт проверки правильности ввода данных. Я сейчас представлю код готового скрипта проверки, а затем разберем, как всегда, все по полочкам.
JavaScript проверка ввода данных в форму регистрации
Код JS
$(function(){
var field = new Array("login", "password",
"confirmpass",
"keystring", "email");
//поля обязательные
$(".formreg").submit(function()
{
// обрабатываем отправку формы
var error=0;
// индекс ошибки
$(".formreg").find(":input").each(function()
{
// проверяем каждое поле в форме
for(var i=0;i<field.length;i++){
// если поле присутствует в списке обязательных
if($(this).attr("name")==field[i]){
//проверяем поле формы на пустоту
if(!$(this).val()){
// если в поле пусто
$(this).css('border', 'red 1px solid');
// устанавливаем рамку красного цвета
error=1;// определяем индекс ошибки
}
else{
$(this).css('border', 'gray 1px solid');
// устанавливаем рамку обычного цвета
}
}
}
})
//провека совпадения паролей
var pas1 = $("#pas1").val();
var pas2 = $("#pas2").val();
if(pas1!=pas2){
error=3;
$("#pas1").css('border', 'red 1px solid');
// устанавливаем рамку красного цвета
$("#pas2").css('border', 'red 1px solid');
// устанавливаем рамку красного цвета
}
if(error==0){
// если ошибок нет, то отправляем данные
return true;
}
else{
var err_text = "";
if(error==1)
err_text="<p class='messageserror'>Пожалуйста, заполните все обязательные поля!
Отмеченные знаком <strong>*</strong>.
Неправильно заполненные поля выделены красным бордюром.
Пожалуйста, будьте внимательней!</p>";
if(error==3) err_text="
Пароли не совпадают, проверьте не включена клавиша 'CapsLосk'";
$("#messenger").html(err_text);
$("#messenger").fadeIn("slow");
return false;
//если в форме встретились ошибки , не позволяем отослать данные на сервер.
}
})
});
Вот такой вот простенький скрипт проверки, или, можно сказать, валидации формы регистрации для сайта. В комментариях я по максимуму все описал, где, что и как происходит. Не будем на этом останавливаться, идем дальше. А сейчас создадим таблицу в базе данных mysql, как создавать таблицы в phpmyadmin можно посмотреть здесь. А мы определим какие поля нам необходимо создать для реализации формы регистрации.
Поля таблицы формы регистрации на сайте
1. Конечно id:
2. Поле таблицы для хранения логина, так его и назовем - "login":
3. Пароль - "password":
4. Поле для хранения ссылки на аватар (при условии, что вы используете поле загрузки);
5. Поле хранения email адреса регистрации;
6. Поле для хранения даты регистрации.
Вот структуру таблицы создали, а теперь переведем все это в язык sql и сделаем такой запрос к базе данных mysql
Код SQL
--
-- Структура таблицы `user`
--
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(55) NOT NULL,
`password` varchar(255) NOT NULL DEFAULT '',
`avatar` varchar(255) NOT NULL DEFAULT '',
`email` varchar(60) NOT NULL,
`reg_date` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=51 ;
У вас должна получится вот такая вот простенькая таблица под названием "user". Я уже говорил, что вещи нужно называть своими именами, вот и таблицу назовем соответственно - user.
И так проверка перед отправкой есть, таблица в бд есть, пожалуй самое время приступить к обработке данных формы php скриптом. Так мы и поступим. Для начала создадим отдельный файл php и назовем его, скажем, reg_add.php. Помните, я говорил при создании формы, куда вписывать путь к обработчику? Напомню: вписываем его здесь.
Код HTML
<form class="formreg" action="обработчик.php" method="post" enctype="multipart/form-data"></form>
// вместо обработчик.php прописываем так
<form class="formreg" action="reg_add.php" method="post" enctype="multipart/form-data"></form>
Ничего сложного. Далее определимся какие поля и как необходимо обработать.
1. Поле "LOGIN" - уберем все теги и скрипты, мало ли кто, что написать придумает, уберем лишние пробелы;
2. Поле "EMAIL" - проверим регулярным выражением на правильность ввода;
3. Поле "PASSWORD" - Проделаем тоже самое, что и с 1, но зашифруем его и добавим реверс;
4. Загрузка файла "FUPLOAD" - обработаем изображение на проверку формата и сделаем ему оптимизацию, подгоним под необходимый размер и ужмем его для интернет страниц;
Всего 4 поля нам неоходимо обработать в php. Давайте, наверное, начнем с самого начала, а именно с подключения к базе и передаче параметров POST.
Давайте приведу пример, как это должно выглядеть на самом деле.
Код PHP
<?php
if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
//заносим введенный пользователем логин в переменную $login, если он пустой, то уничтожаем переменную
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
//заносим введенный пользователем пароль в переменную $password, если он пустой, то уничтожаем переменную
if (isset($_POST['email'])) { $email = $_POST['email']; if ($email == '') { unset($email);} }
//заносим введенный пользователем e-mail, если он пустой, то уничтожаем переменную
if (empty($login) or empty($password) or empty($email))
//добавим переменную с e-mail адресом
//если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
//останавливаем выполнение сценариев
}
if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email))
//проверка е-mail адреса регулярными выражениями на корректность
{exit ("Неверно введен е-mail!");}
// Обработка кода капчи
session_start();
if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] != $_POST['keystring'])
{
exit ("<html><head><meta http-equiv='Refresh' content='5; URL=страница регистрации.php'>
</body></html>
Защитный код из 7 цифр введен неверно, пожалуйста, будьте внимательней!
Вы будете перемещены обратно на страницу регистрации через 5 секунд.
Если не хотите ждать, нажмите на ссылку <a href="index.php">
Вернуться
</a>");
//останавливаем выполнение сценариев
}
?>
Все просто. Далее обработаем переменные php функциями.
Код PHP
<?php
//если логин и пароль введены,то обрабатываем их, чтобы теги и скрипты не работали, мало ли что люди могут ввести
$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
//удаляем лишние пробелы
$login = trim($login);
$password = trim($password);
// дописываем новое********************************************
//добавляем проверку на длину логина и пароля
if (strlen($login) < 5 or strlen($login) > 15) {
exit ("Логин должен состоять не менее чем из 5 символов и не более чем из 15.");
//останавливаем выполнение сценариев
}
if (strlen($password) < 6 or strlen($password) > 15) {
exit ("Пароль должен состоять не менее чем из 6 символов и не более чем из 15.");
//останавливаем выполнение сценариев
}
if (empty($_FILES['fupload']['name']))
{
//если переменной не существует (пользователь не отправил изображение),
то присваиваем ему заранее приготовленную картинку с надписью "нет аватара"
$avatar = "avatars/net-avatara.jpg";
//можете нарисовать net-avatara.jpg или взять в исходниках
}
else
{
//иначе - загружаем изображение пользователя
$path_to_90_directory = 'avatars/';
//папка, куда будет загружаться начальная картинка и ее сжатая копия
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['fupload']['name']))
//проверка формата исходного изображения
{
$filename = $_FILES['fupload']['name'];
$source = $_FILES['fupload']['tmp_name'];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target);
//загрузка оригинала в папку $path_to_90_directory
if(preg_match('/[.](GIF)|(gif)$/', $filename)) {
$im = imagecreatefromgif($path_to_90_directory.$filename) ;
//если оригинал был в формате gif, то создаем изображение в этом же формате.
Необходимо для последующего сжатия
}
if(preg_match('/[.](PNG)|(png)$/', $filename)) {
$im = imagecreatefrompng($path_to_90_directory.$filename) ;
//если оригинал был в формате png, то создаем изображение в этом же формате.
Необходимо для последующего сжатия
}
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) {
$im = imagecreatefromjpeg($path_to_90_directory.$filename);
//если оригинал был в формате jpg, то создаем изображение в этом же формате.
Необходимо для последующего сжатия
}
//СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ
// Создание квадрата 90x90
// dest - результирующее изображение
// w - ширина изображения
// ratio - коэффициент пропорциональности
$w = 90;
// квадратная 90x90. Можно поставить и другой размер.
// создаём исходное изображение на основе
// исходного файла и определяем его размеры
$w_src = imagesx($im);
//вычисляем ширину
$h_src = imagesy($im);
//вычисляем высоту изображения
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);
// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// вырезаем квадратную верхушку по y,
// если фото вертикальное (хотя можно тоже серединку)
if ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// квадратная картинка масштабируется без вырезок
if ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$date=time();
//вычисляем время в настоящий момент.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");
//сохраняем изображение формата jpg в нужную папку,
именем будет текущее время. Сделано,
чтобы у аватаров не было одинаковых имен.
//почему именно jpg? Он занимает очень мало места + уничтожается анимирование
gif изображения, которое отвлекает пользователя.
Не очень приятно читать его комментарий, когда
краем глаза замечаешь какое-то движение.
$avatar = $path_to_90_directory.$date.".jpg";
//заносим в переменную путь до аватара.
$delfull = $path_to_90_directory.$filename;
unlink ($delfull);
//удаляем оригинал загруженного изображения, он нам больше не нужен.
Задачей было - получить миниатюру.
}
else
{
//в случае несоответствия формата, выдаем соответствующее сообщение
exit ("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>"); //останавливаем выполнение сценариев
}
//конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы
}
$password = md5($password);
//шифруем пароль
$password = strrev($password);
// для надежности добавим реверс
$password = $password."здесь любой набор символов и цифр например "2fggi4lj";
//Если этот пароль будут взламывать методом подбора у себя
на сервере этой же md5,то явно ничего хорошего не выйдет.
Но советую ставить другие символы, можно в начале
строки или в середине.
//При этом необходимо увеличить длину поля password в базе.
Зашифрованный пароль может получится гораздо большего размера.
// дописали новое********************************************
// Далее идет все из первой части статьи,но необходимо дописать изменение в запрос к базе.
// подключаемся к базе
include ("путь к файлу с подключением к бд.php");// например файл bd.php
должен быть в той же папке, что и все остальные, если это не так,
то просто измените путь
// проверка на существование пользователя с таким же логином
$result = mysql_query("SELECT id FROM user WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);
if (!empty($myrow['id'])) {
exit ("Извините, введённый вами логин уже зарегистрирован. Введите другой логин.");
//останавливаем выполнение сценариев
}
// если такого нет, то сохраняем данные
$reg_date = date("d-m-Y в H:i");
$result2 = mysql_query ("INSERT INTO user (login,password,avatar,email,reg_date) VALUES('$login','$password','$avatar','$email','$reg_date')");
?>
Теперь все эти примеры занесем в один файл, который создали reg_add.php. Вот и все, у нас теперь работает форма регистрации для своего сайта.