Как заставить jQuery Validate проверить наличие дубликатов имени пользователя в базе данных?



Я вхожу в середину этого проекта, поэтому мне приходится немного переписывать из-за неаккуратного кода. Я использую jQuery 1.6.1 и Validate 1.8.1.



Во-первых, вот PHP, который запускает back-end (dbquery.php):



include("../includes/dbconnection.php");
session_start();

$location='';
$action='';
if($_GET['action']=='')
$action=$_POST['action'];
else
$action=$_GET['action'];

if($action=='checkusername'){
$error='';
$username=$_GET['username'];
// exclude denied account
$checkuserquery=mysql_query("Select * from database_users as user LEFT OUTER JOIN database_approval as approval on user.user_id=approval.approval_user_id where (approval.approval_status IS NULL or approval.approval_status <> 4) and user_username='".$username."'");
$checkuserresult=mysql_numrows($checkuserquery);
if($checkuserresult>0) {
$error = 'false';
} else {
$error = 'true';
}
echo $error;
}


Я пытаюсь использовать сценарий проверки jQuery для запроса базы данных на наличие существующих имен пользователей на лету. Я либо получаю две крайности: он никогда не работает, либо он всегда выплевывает заданное имя пользователя как взятое.



Я полагаю, что проблема заключается в том, что Я не могу захватить входное значение переменной username. Когда я создаю alert (username) внутри function (output), он ничего не возвращает. Мое предположение состоит в том, что .val() работает только тогда, когда страница загружается, поэтому все, что я набираю на входе, по какой-то причине не работает.



Вот jQuery, который я переписал и скопировал из источников в интернете:



$(document).ready(function(){

$.validator.addMethod("checkAvailability",function(value,element){
var username = $("#username").val();
$.ajax({
url: "dbquery.php",
type: "GET",
async: false,
data: "action=checkusername&username="+username,
success: function(output) {
return output;
}
});
},"Sorry, this user name is not available");

// jQuery Validation script
$("#signup").validate( {
rules: {
username: {
required: true,
minlength: 5,
checkAvailability: true // remote check for duplicate username
},
},
messages: {
username: {
required: "Enter a username"
}
},
submitHandler: function(form) {
form.submit();
}
});

});


Я всего лишь новичок в jQuery, но у меня довольно грязные руки с этим кодом. Я на правильном пути или мне следует использовать remote: под rules и username? Мне сказали, что метод remote не будет работать из-за динамической природы входного значения, которое я пытаюсь проверить.



Другая серьезная проблема, с которой я столкнулся, заключается в том, что удаленное сообщение об ошибке появляется только тогда, когда имя пользователя уже существует в базе данных. К сожалению, это показывает ли dbquery.php возвращается как true или false. Если я пытаюсь использовать существующее имя пользователя, оно возвращает false, затем я переписываю новое имя пользователя, которое возвращает true, сообщение не уходит. Аналогично, когда я пишу имя пользователя и оно возвращает true, я все равно получаю удаленное сообщение об ошибке.

Исходный кодер ссылался на getXMLHTTP и использовал ActiveXObject. Метод, который он запрограммировал, казался немного устаревшим, поэтому я пытаюсь сделать код немного более современным и очистить его.

5/25 - я редактирую это, чтобы включить старый исходный код JavaScript, который работает, но использует устаревший метод, от которого я хотел бы избавиться (С тех пор я удалил следующий код и заменено на jQuery выше):



function getXMLHTTP() { //function to return the xml http object
var xmlhttp=false;
try{
xmlhttp=new XMLHttpRequest();
}
catch(e) {
try{
xmlhttp= new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e){
try{
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e1){
xmlhttp=false;
}
}
}

return xmlhttp;
}
//validate username
function validateUsername(username){
var strURL="dbquery.php?action=checkusername&username="+username;
var req = getXMLHTTP();
if (req) {
req.onreadystatechange = function() {
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
if(req.responseText=='notavailable'){
document.getElementById("errorusername").style.display="block";
document.getElementById("errorusername").innerHTML="<div id="errors"><strong>"+username+"</strong> is already taken by another user.</div>";
error = true;
}
else{
error = false;
document.getElementById("errorusername").style.display="none";
}

} else {
alert("There was a problem while using XMLHTTP:n" + req.statusText);
}
}
}
req.open("GET", strURL, true);
req.send(null);
}
}
587   5  

5 ответов:

Проверьте, когда вызывается функция проверки, какое значение имеет username и какое значение имеет output: это true или "true"?

Я предполагаю последнее: строка, так что вы могли бы просто сделать:

return output === "true" ? true : false; // I sincerely recommend using === here

Так как если вы return "false"; будете оценивать в true, потому что это непустая строка - да динамические языки! : /

Пример с remote:

$("#signup").validate( {
    rules: {
        username: {
            required: true,
            minlength: 5,
            remote: {
                url: "dbquery.php",
                type: "get",
                data: {
                    action: function () {
                        return "checkusername";
                    },
                    username: function() {
                        var username = $("#username").val();
                        return username;
                    }
                }
            }
        }
    },
    messages: {
        username: {
            required: "Enter a username"
        }
    },
    submitHandler: function(form) {
        form.submit();
    }
});

Для установки пользовательского сообщения об ошибке ваш PHP-файл должен возвращать сообщение вместо false, поэтому echo "Sorry, this user name is not available" в вашем PHP файл.

При добавлении addMethod Вы должны вернуть true или false со стороны сервера.

А также это значение должно быть возвращено из addMethod.

То есть что-то вроде этого

$.validator.addMethod("checkAvailability",function(value,element){
    var parameter="action=checkusername&username="+username;
    $.ajax({
          url: "dbquery.php",
          type: "POST",
          async: false,
          data: parameter
          success:function(output)
                 {
                    return output
                 }
     });
},"Sorry, this user name is not available");

Я столкнулся с той же проблемой, но я нахожу самое простое решение просто вернуть true или false после кодирования в json через php.

if ($users->username_exists())
{
    echo json_encode(FALSE);
}else{
    echo json_encode(TRUE);
}

В сценарии на стороне сервера попробуйте вернуть true или false вместо available и notavailable, поскольку обе эти строки эквивалентны true.

Мой код:

$( "#myform" ).validate({
  rules: {
    EMAIL: {
      remote: {
        type: "post",  
        url: "checkMail.php",           
        data:{checkUsername:function(){return $("#EMAIL").val()}            
        }
      }
    }
  },messages:{EMAIL:{remote: "Already taken!"}}
});

Comments

    Ничего не найдено.