2016-03-06 118 views
1

我想检查用户名是否在提交表单之前进行。在提交表单之前检查用户名是否可用

据我所知,我必须使用AJAX从JavaScript数据库中获取数据。我如何将用户名发送到PHP文件?

这是我的形式:

<form id="loginForm" action="register.php" method="post"> 
 
    <p>Register:</p> 
 
    <p style="text-align: left;">Full name: <br><input type="text" name="name" required/></p> 
 
    <p style="text-align: left;">Email: <br><input type="text" name="email" required/></p> 
 

 
    //Username 
 
    <p style="text-align: left;">Username: <br><input id="username" type="text" name="username" onkeyup="validateUsername(value);" required/></p> 
 
    <span id="usernameError" style="display:none;border:1px solid red;">Username can only contain a-z, 0-9 and must be at least 6 characters loong</span> 
 
    <span id="usernameTaken" style="display:none;border:1px solid red;">Username taken</span> 
 

 
    <p style="text-align: left;">Password: <br><input type="password" name="password" required/></p> 
 
    <input type="submit" value="Register"> 
 
</form>

这是validateUsername()功能:

function validateUsername(username) { 
 
    var re = /[a-zA-Z0-9]/; 
 
    alert(username.length); 
 
    if(re.test(username) && username.length > 5) { 
 
     document.getElementById('username').style.backgroundColor = "green"; 
 
     document.getElementById('usernameError').style.display= "none"; 
 
     --error; 
 
    } else { 
 
     document.getElementById('username').style.backgroundColor = "red"; 
 
     document.getElementById('usernameError').style.display= "block"; 
 
     ++error; 
 
    } 
 
    //here i want to check if the user name is taken 
 
}

如果用户名称被占用,我想显示'usernameTaken'跨度。 否则,我想隐藏它。

这里是PHP文件来检查,如果用户名是已经在数据库:

<?php 
 
session_start(); 
 
define('DB_NAME', 'madsanker_dk_db'); 
 
define('DB_USER', 'madsanker_dk'); 
 
define('DB_PASSWORD', 'MyPassword'); 
 
define('DB_HOST', 'mysql43.unoeuro.com'); 
 

 
$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD); 
 

 
if (!$link) { 
 
    die('Could not connect: ' .mysqli_error()); 
 
} 
 

 
$db_selected = mysqli_select_db($link, DB_NAME); 
 

 
if (!$db_selected) { 
 
    die('Could not connect: ' .mysqli_connect_error()); 
 
} 
 

 
$username = //The username; 
 
$username = mysqli_real_escape_string($link,$username); 
 

 
$sql = "SELECT * FROM mainLogin WHERE username = '$username'"; 
 

 
$result = mysqli_query($link, $sql); 
 
$count = mysqli_num_rows($result); 
 

 
if($count == 0) { 
 
    //if the username is NOT taken 
 
    return true; 
 
} else { 
 
    //if the username IS taken 
 
    return false; 
 
} 
 
mysqli_close($link); 
 
?>

这是如何完成的?

+0

U可以使用AJAX使用元素的ID或jQuery的 – devpro

+0

哪里是你的问题在此代码发送用户名到PHP?您是否测试过该用户名正确地出现在ajax请求中? –

+0

PHP应该返回某种文档,它不是函数返回。最简单的例子是只打印“true”或“false”。 ** a ** -jax调用是** a ** - 异步调用,所以在验证函数中禁用提交按钮,然后在来自ajax的回调表明所有内容都很好时重新启用它。 'if(this.response ===“true”);'(或经过一些合理的超时,例如2秒) –

回答

0

JS - JQUERY AJAX

$.ajax({ 
    url: 'register.php', data: {action: 'isUserNameTaken', params: [username]}, 
    type: 'post', 
    success: function(data) { 
     //Do Something 
    } 
}); 

PHP

<?php 
 
function isUserNameTaken($username) { 
 
    //Do Something; 
 
} 
 

 
if(!empty($_POST['action'])) { 
 
    $action = $_POST['action']; 
 
    switch($action) { 
 
     case 'isUserNameTaken': 
 
      $username = ''; 
 

 
      if(!empty($_POST['params'])) { 
 
       $username = $_POST['params'][0]; 
 
      } 
 

 
      isUserNameTaken($username); 
 

 
      break; 
 
    } 
 
} 
 
?>

+0

'isset &&!empty'是无意义的,只需使用'!empty'。 – deceze

+0

@deceze感谢您的评论,我编辑了我的答案,虽然说实话,我不是一个PHP开发人员,我只是发现问题做了一个快速的研究,并且想分享我想出来的结果:) –

-1

你可以这样来做: 在客户端:

function validateUsername(){ 
    if(//test username input for length...) { 
    $.ajax({ 
     type: 'POST', 
     url: 'validate.php', 
     data: { username: username }, 
     success: function(response) { 
       if(response==0){ 
       //username is valid 
       } 
       elseif(response==1){ 
       //username is already taken 
       } 
       elseif(response==2){ 
       //connection failed 
       } 

     } 
    }); 
    } 
    else{ 
    //display "username is too short" error 
    } 

} 

validate.php:

<?php 
session_start(); 
define('DB_NAME', 'madsanker_dk_db'); 
define('DB_USER', 'madsanker_dk'); 
define('DB_PASSWORD', 'MyPassword'); 
define('DB_HOST', 'mysql43.unoeuro.com'); 

$link = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD); 

if (!$link) { 
    die('Could not connect: ' .mysqli_error()); 
    echo json_encode(2); 
} 
else{ 
    $db_selected = mysqli_select_db($link, DB_NAME); 

    if (!$db_selected) { 
     die('Could not connect: ' .mysqli_connect_error()); 
     echo json_encode(2); 
    } 
    else{ 
     $username = $_POST["username"]; 
     $username = mysqli_real_escape_string($link,$username); 

     $sql = "SELECT * FROM mainLogin WHERE username = '$username'"; 

     $result = mysqli_query($link, $sql); 

     $count = mysqli_num_rows($result); 
     if($count == 0) { 
     //if the username is NOT taken 
     echo json_encode(0); 
     }else { 
      //if the username IS taken 
      echo json_encode(1); 
     } 
     mysqli_close($link); 
    } 


} 

?> 

您还可以通过jQuery中与的onkeyup函数调用它,以便使该功能validateUsername每当用户输入东西到输入字段,用户名将被检查....

+2

为什么你想添加jQuery只是一个简单的ajax请求,而不是在其他地方使用? – mehulmpt

+0

那么,通过使用onkeyup,你可以检查数据库,每次用户输入内容时,Mads Anker都不想提交表单,然后检查用户名是否正确?所以这是一种可以完成的方式。 –

+1

这将是一个可怕的想法@汤姆。你不想DoS你自己的服务器。SQL查询可能有点贵,如果每个用户在现场成千上万的用户中每秒钟完成10次(假设),那么对于服务器来说,这将是致命的。 – mehulmpt