【问题标题】:codeigniter failed when use is_ajax_request function on ajax request在 ajax 请求上使用 is_ajax_request 函数时,codeigniter 失败
【发布时间】:2018-09-16 06:19:22
【问题描述】:

我正在尝试使用 ajax 请求从面板管理员更新用户密码,在控制器上使用 is_ajax_request() 但此函数显示我不在 ajax 请求中。为什么会这样?

这是我的 ajax jquery:

$.ajax({
    url: urlTarget,
    traditional: true,
    type: 'post',
    dataType: 'json',
    data: {currentPassword:currentPassword, newPassword:newPassword},
    success: function ( result ) {
        if( result.status == 'success' ){
            window.location = baseUrl;
        }else{
            $("#login-invalid-input").show();
            $("#login-submit").attr("disabled", false);
        }
    },
    error: ajax_error_handling
});

在控制器上:

    private function ajax_checking(){
        if ( !$this->input->is_ajax_request() ) {
            redirect( base_url() );
        }
    }

    public function change_password(){
        $this->ajax_checking();
        $this->load->model("admin_model");

        $postData = $this->input->post();
        $id = $this->session->userdata('id_admin');

        if($this->admin_model->check_current_password($id, $postData['currentPassword'])){
            $this->admin_model->change_password($id, $postData['newPassword']);
            $send["status"] == "success";
        }else
            $send["status"] == "fail";

        echo json_encode($send);
    }

由于ajax_checking 的结果为假,系统会将我重定向到设置的网址。谁能帮帮我?

【问题讨论】:

    标签: javascript php jquery ajax codeigniter


    【解决方案1】:

    is_ajax_request() ,该函数检查是否设置了 HTTP_X_REQUESTED_WITH 服务器标头,如果设置响应为 true,否则为 false 则返回布尔响应。

    在你的 constants.php 文件中你可以添加这个:

    define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
    

    然后在您的代码中而不是

    private function ajax_checking(){
        if ( !$this->input->is_ajax_request() ) {
            redirect( base_url() );
        }
    }
    

    使用

    private function ajax_checking(){
        if ( !IS_AJAX ) {
            redirect( base_url() );
        }
    }
    

    更新

    在每个 ajax 请求中设置标头。

    $.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader('HTTP_X_REQUESTED_WITH', 'xmlhttprequest');
        }
    });
    

    【讨论】:

    • 还是一样,结果和is_ajax_request()一样?
    • 请检查我的答案中的更新,让我知道它是否有效? @ana
    • 哦,经过您的多次尝试,我找到了答案,谢谢 smit,
    • 您能否发布答案,以便将来对某人有所帮助? @ana
    • 发生这种情况是因为我在控制器上有这个脚本将我重定向到 basicUrl: public function __Construct() { parent::__Construct(); if($this->session->userdata('logged_in') ) { 重定向( base_url() ); } }
    【解决方案2】:

    感谢您的帮助, 这是将我重定向到 baseUrl 的问题:

    我在控制器上设置了这个, 发生这种情况是因为我在将我重定向到 basicUrl 的控制器上有这个脚本:

        public function __Construct() {
            parent::__Construct();
            if($this->session->userdata('logged_in') ) {
                redirect( base_url() );
            }
        }
    

    【讨论】:

    • 所以这不是关于 ajax 检查,而是关于检查会话用户数据
    【解决方案3】:

    最近,当$this->input->is_ajax_request() 在安装了 Centos Web 面板 (CWP) 的 CentOS 服务器上无法运行时,我在 CodeIgniter 上遇到了类似的问题,而它在我的 localhost 上运行良好。

    我的解决方案是在我的 JavaScript 顶部添加以下内容:

    $.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
        }
    });
    

    由于实时服务器没有发送 CodeIgniter 需要识别 Ajax 请求的标头 X-Requested-With

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 2017-04-02
      • 2018-11-30
      • 2011-08-24
      • 2013-01-15
      • 1970-01-01
      • 2023-03-13
      相关资源
      最近更新 更多