Я вхожу в середину этого проекта, поэтому мне придется немного переписать текст из-за неаккуратного кода.Я использую jQuery 1.6.1 и Validate 1.8.1.
Во-первых, вот PHP, который запускает серверную часть ( 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 Validate для запроса базы данных о существующих именах пользователей на лету.Я либо получаю две крайности: он никогда не работает, либо он всегда выдает заданное имя пользователя как взятое.
Я считаю, что проблема в том, что я не могу получить входное значение переменной 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);
}
}