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

时间:2017-08-01 09:07:03

标签: php ajax codeigniter-3

Windows 10,Codeigniter 3,Wamp3。

Ajax帖子会抛出错误请求错误。这是一个老栗子,但在线研究显示问题通常是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问题?其他一切似乎都很好。我花了这么多时间在这上面! 到底是怎么回事?

5 个答案:

答案 0 :(得分: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>

并从控制器操作$name中删除参数hello()

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

答案 1 :(得分:0)

写这样的网址

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

/fullnameargument function hello()

答案 2 :(得分: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;
        });

答案 3 :(得分:0)

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 Document ..

答案 4 :(得分:-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);

            }
        });

    });

});