Проверка занятости (уникальности) персональных данных без перезагрузки страницы при регистрации

Есть несколько готовых библиотек, которые позволяют без перезагрузки страницы проверять уникальность вводимых данных без перезагрузки страницы по технологии AJAX (в статье речь не о них, но о простом «велосипеде» на jQuery). Это в подавляющих случаях используется в формах регистрации на сайтах. Наример, постановка задачи: необходимо ввести Ник (ФИО) и E-mail и автоматически в фоне проверить, есть ли такой же Ник и такой же электронный почтовый адрес уже в базе зарегистрированных пользователей.



Для начала напишем форму со всеми необходимыми полями в рамках поставленной задачи, т.е. без антиспама, о котором можно прочитать в одной из статей нашей Програмиллы:
<form name="reg" method="post" action="action/action.registration.php" onSubmit="return checkedFormReg(this)">
    <input name="releFio" type="hidden">
    <input name="releEmail" type="hidden">
    <table width="100%" border="0" cellspacing="0" cellpadding="5" style="font-weight: bold;">
    <tr>
        <td width="40%" align="right">Представьтесь, пожалуйста</td>
        <td>
            <input maxlength="32" name="fio" type="text" style="width:200px;" onchange="responseFio();">
            <span id="responseFioSpan" style="margin-left: 10px;"></span>
        </td>
    </tr>
    <tr>
        <td width="40%" align="right">E-mail</td>
        <td>
            <input maxlength="64" name="email" type="text" style="width:200px;" onchange="responseEmail();">
            <span id="responseEmailSpan" style="margin-left: 10px;"></span>
        </td>
    </tr>
    <tr>
        <td width="40%" align="right"><input type="reset" value="Очистить" onclick="resetRegForm();"></td>
        <td><input type="submit" value="Регистрация" id="buttonSub"></td>
    </tr>
    </table>
</form>


Обратите внимание на:
<span id="responseFioSpan" style="margin-left: 10px;"></span>
и
<span id="responseEmailSpan" style="margin-left: 10px;"></span>
В этих «спанах» мы будем выводить уведомления.

Далее приведём две функции на JavaScript, которые будут проверять уникальность вводимых данных используя конструкцию $.ajax от jQuery:
function responseFio(){
        $.ajax({
            type: "POST",
            url: "/action/ajax.response.registration.php",
            data: { action: 'fio', user: document.reg.fio.value },
            cache: false,
            success: function(response){
                if(response == 'on'){
                    $("#responseFioSpan").text("Имя занято").css("color","red");
                    document.reg.releFio.value = 'off';
                }else{
                    $("#responseFioSpan").text("Имя свободно").css("color","green");
                    document.reg.releFio.value = 'on';
                };
            }
        });
    };
    
    function responseEmail(){
        $.ajax({
            type: "POST",
            url: "/action/ajax.response.registration.php",
            data: { action: 'email', email: document.reg.email.value },
            cache: false,
            success: function(response){
                if(response == 'on'){
                    $("#responseEmailSpan").text("E-mail занят").css("color","red");
                    document.reg.releEmail.value = 'off';
                }else{
                    $("#responseEmailSpan").text("E-mail свободен").css("color","green");
                    document.reg.releEmail.value = 'on';
                };
            }
        });
    };
В этих функциях идёт обращение к файлу /action/ajax.response.registration.php, который как раз и делает проверку запросом в базу данных:
# configuration charset
ini_set(default_charset,"UTF-8");

global $_POST;
       
# include data base
require "../../mysql.inc.php";

switch ($_POST['action']){
    
	case "fio":
        $row = $DB->selectRow('SELECT * FROM ?_tbl_user WHERE binary(user)=? LIMIT ?d', trim($_POST['fio']), 1);
        if($row){ echo "on"; }else{ echo "off"; };
        break;
        
    case "email":
        $row = $DB->selectRow('SELECT * FROM ?_tbl_user WHERE binary(user_email)=? LIMIT ?d', trim($_POST['email']), 1);
        if($row){ echo "on"; }else{ echo "off"; };
        break;
        
};

В зависимости от ответов меняются значения наших переключателей
<input name="releFio" type="hidden">
    <input name="releEmail" type="hidden">
и меняются уведомления.

Осталось привести последнюю функцию (к ней идёт обращение в форме по субмиту), которая замыкает наши вопросы и подводит черту под поставленной задачей:
function checkedFormReg(form){
        if(document.reg.fio.value.length < 3){
            alert("Представьтесь, пожалуйста (не менее 3-х символов)!");
            document.reg.fio.focus();
            return false;
        }else{
            responseFio();
        };
        if(document.reg.email.value.length < 6){
            alert("В E-mail должно быть не менее 6 (шести) символов!");
            document.reg.email.focus();
            return false;
        }else{
            responseEmail();
        };
        //
        if(document.reg.releFio.value == 'off' || document.reg.releEmail.value == 'off'){
            alert('Введите уникальные данные!');
            return false;
        }else{
            return true;
        };
    };

И функцию для reset:
function resetRegForm(){
        $("#responseFioSpan").text("");
        $("#responseEmailSpan").text("");
    };


Вуаля!

Теперь необходимо сказать несколько слов в защиту события onchange, по которому происходит проверка (вызов функций responseFio() и responseEmail()). Дело в том, что используемое событие срабатывает не во время ввода данных, что было бы очень напряжно для сервера, но непосредственно при смене фокуса! Вот такой нюанс.

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

RSS свернуть / развернуть
+
0
Ajax плотно входит в нашу жизнь однако. Все равно у меня вопрос возникает о целесообразности использования jQuery. Можешь привести аргументы в пользу НЕписания своих велосипедов под ajax, а пользования jQuery в данном примере?
avatar

PigmaLion

  • 25 мая 2011, 09:08
+
0
1. Про Ajax: Не входит, но давно вошёл в нашу жизнь. Ибо web 2.0, это и есть приложения с использованием Ajax.

2. Про jQuery: Никакой магической целесообразности использования jQuery нет. С таким же успехом можно было бы воспользоваться и другими библиотеками. Просто мне на jQuery легче, с ним давно работаю. Дело вкуса.

3. Про велосипед: Лично мне нравится писать свои велосипеды. Так я больше понимаю что происходит и как. Можно было прикрутить стороннюю библиотеку на базе того же jQuery, но я не смог справиться с усмирением пытливости свего ума.
avatar

degtyarchuk

  • 25 мая 2011, 09:15

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

Яндекс цитирования