簡體   English   中英

帶有ajax和codeigniter的“錯誤請求”

[英]'Bad Request' with ajax and codeigniter

Windows 10,Codeigniter 3,Wamp3。

Ajax發布會引發Bad Request錯誤。 這是一個古老的板栗,但在線研究表明問題通常出在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問題嗎? 其他一切似乎都正常。 我花了很多時間在這上面! 到底是怎么回事?

數據已經通過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;
}

這樣寫網址

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

/fullname它是function hello()argument

嘗試這個..

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

和阿賈克斯

$(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;
        });

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>

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