javascript 使用 PHP CodeIgniter、JQuery、AJAX 验证数据库中是否已存在用户名
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18797548/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Username verification if already exists in the database using PHP CodeIgniter, JQuery, AJAX
提问by Fionnlagh Endika
I am trying to check the username's validity first before the user hits the submit button using Codeigniter. The status of the username if it is taken or not will just appear beside it.
Here is the JS in the view:
在用户使用 Codeigniter 点击提交按钮之前,我试图首先检查用户名的有效性。用户名的状态是否被占用只会出现在它旁边。
这是视图中的JS:
<script type="text/javascript" src="../assets/js/jquery.min.js"></script>
<script type="text/javascript"><!--
$(document).ready(function() {
$("#username").blur(function() {
//remove all the class add the messagebox classes and start fading
$("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");
//check the username exists or not from ajax
$.post("addpatient/check_user_availability",{ username:$(this).val() } ,function(data) {
if(data=='no') {
$("#msgbox").fadeTo(200,0.1,function() { //start fading the messagebox
//add message and change the class of the box and start fading
$(this).html('This User name Already exists').addClass('messageboxerror').fadeTo(900,1);
});
}
else {
$("#msgbox").fadeTo(200,0.1,function() { //start fading the messagebox
//add message and change the class of the box and start fading
$(this).html('Username available to register').addClass('messageboxok').fadeTo(900,1);
});
}
});
});
});
</script>
Here is a part of the form in html:
这是 html 中表单的一部分:
<form method="post" action="addpatient/insert" name="register">
<table id='addpatient'>
<tr>
<td width=100> Username:
<td width=150> <input type='text' id='username' name='username' value="<?php if(isset($_POST['username'])) echo $_POST['username']; ?>" placeholder="5-15 char" pattern=".{5,15}" required>
<td> <span id="msgbox" style="display:none"></span>
<td><div id="msgbox"></div>
</tr>...
Here is the controller:
这是控制器:
function check_user_availability()
{
$username = $this->input->post('username');
// Developed by Roshan Bhattarai
// Visit http://roshanbh.com.np for this script and more.
// This notice MUST stay intact for legal use
//this varible contains the array of existing users
$existing_users=$this->user->get_all_usernames();
//value got from the get metho
$user_name= $username;
//checking weather user exists or not in $existing_users array
if (in_array($user_name, $existing_users))
{
//user name is not availble
echo "no";
}
else
{
//user name is available
echo "yes";
}
}
And this is a function in the model:
这是模型中的一个函数:
function get_all_usernames() {
$this->db->select('username');
$this->db->from('users');
$query = $this->db->get();
return $query->result();
}
However, when I run it, it always says that the username is availableto register even though the username has been taken already.
Another problem is that it doesn't check the username's validity as the user types in his/her desired username in "real time". What I mean is, the user has to click on the next textfields first before the code checks the validity.
Please help me solve these problems. Thank you!
但是,当我运行它时,它总是说即使用户名已经被占用,用户名也可以注册。
另一个问题是,当用户“实时”输入他/她想要的用户名时,它不会检查用户名的有效性。我的意思是,在代码检查有效性之前,用户必须先单击下一个文本字段。
请帮我解决这些问题。谢谢!
回答by Nil'z
Try this:
试试这个:
function check_user_availability()
{
$username = $this->input->post('username');
$result = $this->user->get_all_usernames( $username ); #send the post variable to the model
//value got from the get metho
$user_name= $username;
if( $result ){
echo "no";
}else{
echo "yes";
}
}
function get_all_usernames( $username ) {
$this->db->select('username');
$this->db->where('username', $username)
$this->db->from('users', 1);
$query = $this->db->get();
if( $query->num_rows() > 0 ){
return 0;
}else{
return 1;
}
}
Changes in the script:
脚本中的变化:
$(document).ready(function() {
$("#username").keyup(function() {
//remove all the class add the messagebox classes and start fading
$("#msgbox").removeClass().addClass('messagebox').text('Checking...').fadeIn("slow");
//check the username exists or not from ajax
var name = $(this).val();
$.ajax({
url : "<?=base_url()?>addpatient/check_user_availability",
data : { username : name },
type : 'POST',
success : function(data){
if( data == '0' ){
$("#msgbox").fadeTo(200,0.1,function() { //start fading the messagebox
//add message and change the class of the box and start fading
$(this).html('This User name Already exists').addClass('messageboxerror').fadeTo(900,1);
});
}else if( data == '1' ){
$("#msgbox").fadeTo(200,0.1,function() { //start fading the messagebox
//add message and change the class of the box and start fading
$(this).html('Username available to register').addClass('messageboxok').fadeTo(900,1);
});
}else{
alert("Some error occured! Check Console");
}
}
});
});
});
回答by Avin Varghese
Controller:
控制器:
function check_user_availability() {
$username = $this->input->post('username');
$this->form_validation->set_rules('username', 'Username', 'required|is_unique[users.username]');
if ($this->form_validation->run() == FALSE) {
//user name is not availble
echo "no";
} else {
//user name is available
echo "yes";
}
}
Replace your check_user_availability() in controller with above. no need of using your get_all_usernames model
.
将控制器中的 check_user_availability() 替换为上述内容。无需使用您的get_all_usernames model
.
View documentation for Form_Validation, set_rules