2013-03-02 76 views
0

我已经沿着一个ajax查找tutorial通知用户,如果用户名已被采取。ajax mysql查找不返回正确的结果为多字字符串

所以控制器语法是:

<?php 
    class Login extends CI_Controller 
    { 
     function index() 
     { 
      $this->load->view('loginView'); 
     } 
     function getResultfromdb($username){ 

      $this->db->where('username',$username); 
      $query = $this->db->get('users')->num_rows(); 
      if($query == 0) echo 'userOk'; 
      else echo 'userNo'; 
     } 
    } 

的观点是:

<html> 
    <head> 
     <title>Check User Name</title> 
     <link type="text/css" rel="stylesheet" href="<?=base_url()?>css/style.css"/> 
    </head> 

    <body> 
     <form method="post" action=""> 

      <label for="username">Enter Your Name</label> 
      <input type="text" id="username"/> 
      <span class="checkUser" ></span> 
      <input type="hidden" class="hiddenUrl"/> 
     </form> 

     <script type="text/javascript" src="<?=base_url()?>js/jquery-1.6.2.min.js"></script> 
     <script type="text/javascript" src="<?=base_url()?>js/check.js"></script> 

    </body> 
</html> 

的check.js是:

$(document).ready(function(){ 

    $('#username').blur(function(){ 

     if($('#username').val().length >= 3) 
      { 
       var username = $('#username').val(); 
       getResult(username); 
      } 
     return false; 
    }) 
    function getResult(name){ 
     var baseurl = $('.hiddenUrl').val(); 
     $('.checkUser').addClass('preloader'); 
     $.ajax({ 
      url : baseurl + 'index.php/login/getResultfromdb/' + name, 
      cache : false, 
      success : function(response){ 
       $('.checkUser').removeClass('preloader'); 
       if(response == 'userOk') $('.checkUser').removeClass('userNo').addClass('userOk'); 
       else $('.checkUser').removeClass('userOk').addClass('userNo');; 
      } 
     }) 
    } 
}) 

如前所述,这个伟大的工程。所以它会完美验证bobandy。但它在bob smithandy jones上失败。如何修改代码来验证带空格的字符串?

感谢一如既往,

回答

1

由于您试图在URL中传递用户名,因此失败,浏览器在传递空间时可能会将空间编码为%20。所以你的CI功能正在寻找bob%20smith而不是bob smith。

首先,我不认为这是一种很好的做法,即使允许用户名中的空格,但每个用户名都有自己的空格。你首先需要解码URL

function getResultfromdb($username){ 

      $this->db->where('username',urldecode($username)); 
      $query = $this->db->get('users')->num_rows(); 
      if($query == 0) echo 'userOk'; 
      else echo 'userNo'; 
     } 
+0

更不用说显而易见的SQL注入。 – Iraklis 2013-03-02 12:38:32

+0

当使用自己的活动记录时,CI转义SQL注入。 – 2013-03-02 12:41:31

+0

我的错误,我在考虑不验证用户输入,因为他没有使用表单验证类。 – Iraklis 2013-03-02 12:46:32

0

使用encodeURIComponent(string),例如:

var name = encodeURIComponent(name); 

,你的js看起来像这样

$(document).ready(function(){ 

$('#username').blur(function(){ 

    if($('#username').val().length >= 3) 
     { 
      var username = $('#username').val(); 
      getResult(username); 
     } 
    return false; 
}) 
function getResult(name){ 
    var name = encodeURIComponent(name); // Replace name before send it 
    var baseurl = $('.hiddenUrl').val(); 
    $('.checkUser').addClass('preloader'); 
    $.ajax({ 
     url : baseurl + 'index.php/login/getResultfromdb/' + name, 
     cache : false, 
     success : function(response){ 
      $('.checkUser').removeClass('preloader'); 
      if(response == 'userOk') $('.checkUser').removeClass('userNo').addClass('userOk'); 
      else $('.checkUser').removeClass('userOk').addClass('userNo');; 
     } 
    }) 
} 
}) 

和PHP:

<?php 
$url = urldecode($_GET['name']); // Replace with your parameter 
?> 

好吧运气