2017-08-01 67 views
1

Windows 10,Codeigniter 3,Wamp3。'Bad Request'with ajax and codeigniter

Ajax post引发错误的请求错误。这是一个古老的栗子,但在线研究表明这个问题通常是CSRF。但是我要强调的是我已经CSRF禁用此测试开始:

config['csrf_protection'] = FALSE; 

我已经设置了一些故意非常简单的测试代码。控制器看起来是这样的:

class Ajax extends CI_Controller { 

public function index() { 


$this->load->view('pages/index'); 
} 

public function hello($name) { 
    $fullname = $this->input->post('fullname'); 
    echo 'Hello '.$fullname; 

} 

}//EOF 

和观点如下:

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Demo Ajax</title> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'POST', 
       data: {fullname: fullname}, 
       url:'<?php echo base_url('ajax/hello'); ?> + fullname', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 
</head> 
<body> 

Name <input type="text" id="fullname"> 
<input type="button" value="Hello" id="bttHello"> 
<br> 
<span id="result1"></span> 

</body> 
</html> 

控制台显示一个错误的请求

POST XHR http://localhost/faith/ajax/hello%20+%20fullname [HTTP/1.1 400 Bad Request 9ms] 

所以,如果CSRF是不是罪魁祸首,是它一个Wamp的问题?其他一切似乎都很好。我花了这么多时间在这个上! 这是怎么回事? /fullname

+0

你应该检查你的服务器错误日志中实际的错误,而不是试图猜测问题。 –

+0

首先你使用ajax后,然后你为什么发送数据params附加URL。不需要发布数据就足以向控制器方法发送参数。其次,你好帕拉姆有名称参数需要然后你期望通过正常的职位。第三,你从ajax中得到的参数是好的,那么在这些美丽的括号内,参数的名字是什么。如果它的可选参数使它们可选。从ajax url中删除参数,并在method中设置方法参数。你很好去.. –

回答

1

数据通过POST已经发送。无需通过它通过URL

<script> 
$(function() { 
    $('#bttHello').click(function(){ 
    var fullname = $('#fullname').val(); 
    $.ajax({ 
     type:'POST', 
     data: {fullname: fullname}, 
     url:"<?php echo base_url('ajax/hello'); ?>", 
     success: function(result) { 
     $('#result1').html(result); 
     } 
    }); 
    }); 
}); 
</script> 

而且,从控制器动作hello()删除参数$name

public function hello() { 
    $fullname = $this->input->post('fullname'); 
    echo 'Hello '.$fullname; 
} 
+0

这工作完美 - 非常感谢!现在我有另一个问题,因为当我启用csrf我想从cookie中获取值,但jquery.cookie.js不适合我... – Perkin5

+0

@ Perkin5:我希望我能帮助你解决新问题。但是,我以前没有在codeigniter中工作过。所以,我不会把你从路上转移。我会建议你提出关于CSRF问题的另一个问题。 *请不要介意。* –

-2
use this way 
you should concate fullname variable after quatation. 
like this 
url:'<?php echo base_url('ajax/hello'); ?>' + fullname 


<script> 
$(function() { 
    $('#bttHello').click(function(){ 
     var fullname = $('#fullname').val(); 
     $.ajax({ 
      type:'POST', 
      data: {fullname: fullname}, 
      url:'<?php echo base_url('ajax/hello'); ?>' + fullname, 
      success: function(result) { 
       $('#result1').html(result); 

      } 
     }); 

    }); 

}); 

+2

“* ..使用这种方式*”。你能否解释为什么OP会使用这个答案。每个答案都需要解释。 –

0

写网址这样

"url": "<?php echo base_url().'ajax/hello';?>/" + fullname 

其一个function hello()argument

0

试试这个..

<?php echo form_open('ajax/hello', [ 
      'method' => 'post', 
      'class' => 'create_form' 
     ]); ?> 
     <input type="text" name="fullname" value="Full Name"/> 
<button type="submit">Create</button> 
    <?php echo form_close(); ?> 

和Ajax

$(document).on('submit', 'form.create_form', function (e) { 
      var self = this; 
      var formData = new FormData($(this)[0]); 
      $.ajax({ 
       url: $(self).attr('action'), 
       type: 'POST', 
       data: formData, 
       async: false, 
       dataType: 'json', 
       success: function (res) { 
        console.log(res) 
       }, 
       cache: false, 
       contentType: false, 
       processData: false 
      }); 
      return false; 
     }); 
0

的笨控制器:

<?php 
class Ajax extends CI_Controller 
{ 
    public function index() 
    { 
     $this->load->view('pages/index'); 
    } 
    /** 
    * @param $name 
    */ 
    public function hello($name) 
    { 
     // if no $name params value pass and post exist 
     if (! isset($name) && $this->input->post('fullname')) { 
      // get value from post params 
      $fullname = $this->input->post('fullname', true); 
     } elseif (isset($name) && ! $this->input->post('fullname')) { 
      // get value from pass param method 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
    /** 
    * Another way if we using GET params 
    * e.g. http://wwww.site.com/ajax/hello/my-name-value 
    * @param $name 
    */ 
    public function hello_another($name) 
    { 
     // if url has param as name value 
     // remember codeigniter will map all url params as method params as they provided 
     // no need to use get input, it will take from url string directly 
     if (isset($name)) { 
      // get value from get params 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
    /** 
    * Another way if we using GET params and security is on top 
    * e.g. http://wwww.site.com/ajax/hello/my-name-value 
    * @param $name 
    */ 
    public function hello_another_secure($name) 
    { 
     // if url has param as name value 
     // remember codeigniter will map all url params as method params as they provided 
     // no need to use get input, it will take from url string directly 
     if (isset($name) && preg_match("/^[a-zA-Z'-]+$/", $name)) { 
      // get value from method params 
      $fullname = $name; 
     } else { 
      // default value 
      $fullname = 'No Name or invalid name found'; 
     } 
     // show ajax response 
     echo $fullname; 
    } 
} 
//EOF 

<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'POST', 
       data: {fullname: fullname}, 
       url:'<?php echo base_url('ajax/hello'); ?>', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 

<script> 
    $(function() { 
     $('#bttHello').click(function(){ 
      var fullname = $('#fullname').val(); 
      $.ajax({ 
       type:'GET', 
       url:'<?php echo base_url('ajax/hello_another/'); ?> + fullname', 
       success: function(result) { 
        $('#result1').html(result); 

       } 
      }); 

     }); 

    }); 
</script> 

的笨完全能够满足您的需求,只要看看他们的AWESOME Document第一..