简体   繁体   English

带有ajax和codeigniter的“错误请求”

[英]'Bad Request' with ajax and codeigniter

Windows 10, Codeigniter 3, Wamp3. Windows 10,Codeigniter 3,Wamp3。

Ajax post throws a Bad Request error. Ajax发布会引发Bad Request错误。 This is an old chestnut but online research shows the problem usually to be CSRF. 这是一个古老的板栗,但在线研究表明问题通常出在CSRF上。 However I emphasize at the outset that I have csrf disabled for this test: 但是,我一开始就强调我已禁用此测试的csrf:

config['csrf_protection'] = FALSE;

I have set up some deliberately very simple test code. 我已经设置了一些故意非常简单的测试代码。 The controller looks like this: 控制器如下所示:

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

and the view looks like this: 该视图如下所示:

<!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>

The console shows a Bad Request 控制台显示错误请求

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

So if csrf is not the culprit, is it a Wamp issue? 因此,如果csrf不是罪魁祸首,这是Wamp问题吗? Everything else seems to work fine. 其他一切似乎都正常。 I have spent so much time on this! 我花了很多时间在这上面! What is going on? 到底是怎么回事?

Data are already sent through POST . 数据已经通过POST发送。 No need to pass it through URL 无需通过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>

And, remove parameter $name from controller action hello() . 并且,从控制器操作hello()删除参数$name

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

write url like this 这样写网址

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

after /fullname its a argument of function hello() /fullname它是function hello()argument

Try this.. 尝试这个..

    <?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(); ?>

and 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;
        });

The CodeIgniter Controller: CodeIgniter控制器:

<?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>

The CodeIgniter is fully capable to fulfil your needs, Just look their AWESOME Document first.. CodeIgniter完全有能力满足您的需求,只需先查看其AWESOME文档即可

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);

            }
        });

    });

});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM