2013-07-05 11 views
0

Как говорится в названии, я пытаюсь проверить, существует ли имя пользователя в БД в регистрационной форме с использованием Ajax.Проверка имени пользователя ajax

Я использую следующий скрипт:

$(document).ready(function() { 

    //the min chars for username 
    var min_chars = 3; 

    //result texts 
    var characters_error = 'Minimum amount of chars is 3'; 
    var checking_html = 'Checking...'; 

    //when button is clicked 
    $('#user_id').keyup(function(){ 
     //run the character number check 
     if($('#user_id').val().length < min_chars){ 
      //if it's bellow the minimum show characters_error text ' 
      $('#username_availability_result').html(characters_error); 
     }else{ 
      //else show the cheking_text and run the function to check 
      $('#username_availability_result').html(checking_html); 
      check_availability(); 
     } 
    }); 

}); 

//function to check username availability 
function check_availability(){ 

    //get the username 
    var user_id = $('#user_id').val(); 

    //use ajax to run the check 
    $.post("db.php", { user_id: user_id }, 
     function(result){ 
      //if the result is 1 
      if(result == 1){ 
       //show that the username is available 
       $('#username_availability_result').html(user_id + ' is Available'); 
      }else{ 
       //show that the username is NOT available 
       $('#username_availability_result').html(user_id + ' is not Available'); 
      } 
     }); 

} 

и мой db.php файл выглядит следующим образом:

if (isset($_POST['action']) && $_POST['action'] == "signup") { 
$user_id  = mysql_real_escape_string($_POST["user_id"]); 
$new_password = md5(mysql_real_escape_string($_POST["new_password"])); 
$new_email = mysql_real_escape_string($_POST["new_email"]); 
$checking_existance=mysqli_query($str,"SELECT username FROM users WHERE username='".$user_id."'"); 
$row=mysqli_fetch_assoc($checking_existance); 
print_r($checking_existance); 
if(mysqli_num_rows($checking_existance)>0) 
{ 
    echo 0; 
} 
else{ 
    echo 1; 
} 

}

Проблема я встречая является то, что в результате всегда показывает, что имя пользователя недоступно, даже если оно есть.

+0

MD5 не является безопасным. Вы должны использовать bcrypt. – SLaks

+0

Не имеет смысла хешировать бегущую строку. – SLaks

+0

'action' не передается в вашем' ajax' звонке – AlexP

ответ

0

Я нашел, что это полезно для you.You может проверить свое решение по следующей ссылке Click Here или Here

0

Ваш файл db ищет ряд $_POST переменных, которые не прошли в.

action, new_password and new_email

Я бы предположил, что если вы сделали console.log(result) вы получите undefined, поэтому его не = 1 и поэтому идет в заявлении еще.

Вы должны изменить AJAX вызов:

$.post("db.php", { 
    user_id: user_id, 
    action: action, 
    new_password: new_password, 
    new_email: new_email 
}, ... 
+0

В дополнение к этому OP печатает весь результат через 'print_r ($ check_existance);', поэтому результат никогда не будет 0 или 1 –

+0

Зачем мне нужно передавать пароль и электронную почту, если я не использую их для получения результата? Операция 'if' в db.php не требует' new_password' ни 'new_email' для выполнения! – Suvimo

+0

@Suvimo Ты ими пользуешься! а не в запросе, но на странице используются переменные 'POST', которые вы не публикуете, что означает ошибку! – AlexP

0

просто сделать это в легком пути (i found that there is no action, new_password and new_email parameters in your javascript), пожалуйста, позаботьтесь о том, что слишком.

Javascript

var min_chars = 3; 
var characters_error = 'Minimum amount of chars is 3'; 
var checking_html = 'Checking...'; 
var xhr_request = false; 
var usernames = {}; 

$(function() { 
    $("#user_id").on("keyup", check_availability); 
}); 

function check_availability() { 
    if (xhr_request) { 
    xhr_request.abort(); 
    } 
    var user_id = $.trim($(this).val()); 
    if (!user_id || user_id.length < min_chars) { 
    $("#username_availability_result").html(characters_error); 
    return; 
    } 

    // check user_id exists in runtime cache, to avoid useless requests :\ 
    if (usernames[user_id] !== undefined) { 
    if (usernames[user_id] === true) { 
     //show that the username is available 
     $("#username_availability_result").html(user_id+" is Available"); 
    } 
    else { 
     //show that the username is NOT available 
     $("#username_availability_result").html(user_id+' is not Available'); 
    } 
    return; 
    } 

    //use ajax to run the check 
    xhr_request = $.post("c.php", { 'action' : 'validate', 'user_id' : user_id }); 
    xhr_request.success(function(result) { 
    //if the result is 1 
    if (result == 1) { 
     // add user_id to cache 
     usernames[user_id] = true; 
     //show that the username is available 
     $("#username_availability_result").html(user_id+" is Available"); 
    } 
    else { 
     // add user_id to cache 
     usernames[user_id] = false; 
     //show that the username is NOT available 
     $("#username_availability_result").html(user_id+' is not Available'); 
    } 

    }); 
    xhr_request.fail(function() { 
    $("#username_availability_result").html("connection error, please try again"); 
    }); 
} 

PHP

<?php 
    if (isset($_POST["action"]) && isset($_POST["user_id"])) { 
    $mysqli = new mysqli("localhost", "my_user", "my_password", "my_db"); 
    $userid = $mysqli->real_escape_string($_POST["user_id"]); 

    if ($_POST["action"] === "validate") { 
     $result = $mysqli->query("SELECT username FROM users WHERE username = '{$userid}'"); 

     if ($result && $result->num_rows > 0) { 
     echo "0"; 
     } 
     else { 
     echo "1"; 
     } 
    } 
    elseif ($_POST["action"] == "signup") { 
     // do the process 
    } 
    } 
?> 
+0

спасибо! но как это проще, чем мое? Вы используете почти тот же подход! – Suvimo

+0

и почему нужны 'new_password' и' new_email' на этом уровне? мы не используем их для получения результатов! – Suvimo

+0

lol, я согласен, я хочу уменьшить бесполезные множественные запросы. – bystwn22

Смежные вопросы