【问题标题】:AJAX not mating up with Codeigniter ControllerAJAX 与 Codeigniter 控制器不匹配
【发布时间】:2010-12-31 17:03:46
【问题描述】:

我正在学习 AJAX,并从 Scratch 借用了 NETTUTS Codeigniter 的脚本:AJAX 该脚本本身可以完美地适应我的表单,但是它不会根据控制器更新数据库。 Firebug 说这篇文章在 AJAX 脚本中运行良好。我想我的问题是,我如何以及在哪里无法启动控制器?

form_open 脚本

echo form_open('contacts/entry', $form);

Ajax 脚本(在我展示的上面有一个验证脚本可以正常工作)

 var form_data = {
    fname: $('#fname').val(),
    lname: $('#lname').val(),
    email: $('#email').val(),
    phone: $('#phone').val(),
    relate: $('#relate').val(),
    ajax: '1'
};

$.ajax({
    url: "<?php echo site_url('contacts/entry'); ?>",
    type: 'POST',
    data: 'form_data',
    success: function() {
        $('#status').text('Update successful!'); 
    }
});

return false;   

});

请注意,我在 form_data 中包含了“AJAX:1”
控制器

function entry()
{
   if ($this->input->post('ajax')) {  
   $data = array
           (
           'fname' => $this->input->post('fname'),
           'lname' => $this->input->post('lname'),
           'email' => $this->input->post('email'),
           'phone' => $this->input->post('phone'),
           'relate' => $this->input->post('relate'),
           );

   //removed validation set rules to shorten the question

   if ($this->form_validation->run() == TRUE)
   {
    $this->db->insert('contacts', $data);   
    $this->index();    
   } else
   {
    $this->index();
   }       
} 
}

使用“if ($this->input->post('ajax'))”是启动控制器的正确方法吗?如果没有 jquery,表单本身可以正常工作并运行控制器。所以我知道这两个单独的部分是有效的,它们只是没有啮合。谢谢

【问题讨论】:

    标签: jquery ajax codeigniter


    【解决方案1】:

    首先,我将删除 var form_data { ajax: '1' } 并使用如下内容:

    if($this->input->server('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest')
    {
        // This is AJAX
    }
    else {
        // This is standard HTTP
    }
    

    如果使用 MY_Controller 来处理这个问题,一个很好的方法。如果你使用它,添加一个这样的函数:

    protected function is_ajax() {
        return ($this->input->server('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest') ? TRUE : FALSE;
    }
    

    你可以使用:

    if($this->is_ajax())
    {
        // This is AJAX
    }
    else {
        // This is HTTP
    }
    

    然后您必须回显结果以将其传递给实际视图并处理操作。像这样:

    if ($this->form_validation->run() == TRUE)
    {
        // Tip: you've to do the data management on MODELS
        $action = $this->db->insert('contacts', $data);
    
        // With this method you can handle AJAX and HTTP on the same
        // validation. If is AJAX you print, if not you redirect.
        if($this->is_ajax())
            echo $action;
        else {
            // if worked, redirect the user to the success 
            // else send it to the form error
            if($action)
                redirect("form_success");
            else
                redirect("form_error");
        }
    else {
        if($this->is_ajax())
            echo false;
        else {
            $this->load->view("error_form");
        }
    }
    

    你必须更正你的 jQuery 代码来处理这个操作:

    $.ajax({
        url: "<?php echo site_url('contacts/entry'); ?>",
        type: 'POST',
        data: form_data, // Like said jondavidjohn
        success: function(data) {
            if(data)
            {
                $('#status').text('Update successful!');
            } else {
                $('#status').text('Operation failed!');
            } 
        }
    });
    

    【讨论】:

    • 是的,所以基本上我建议的所有内容 + 检查 XMLHttpRequest。
    • 并检查 if(data === true) 是多余的,默认情况下它检查是否为真。
    • @jondavidjohn:谢谢!我编辑它! :) 我也添加了一些来在同一个函数中处理 ajax 和 http。
    • 当您升级到 CI 2.0 时,您可以使用 $this->input->is_ajax_request();
    【解决方案2】:

    您发布的是字符串 'form_data' 而不是变量 form_data ,请删除 form_data 周围的引号并重试。

    $.ajax({
        url: "<?php echo site_url('contacts/entry'); ?>",
        type: 'POST',
        data: form_data,    // <-- previously you had data: 'form_data', which would pass the string 'form_data', not the variable.
        success: function() {
            $('#status').text('Update successful!'); 
        }
    });
    

    我还会回显您的数据库操作的结果,然后使用返回的数据来测试数据库操作是否成功完成。

    php/CI

    ...
    echo $this->db->insert('contacts',$data);
    ...
    

    jQuery/AJAX

    ...
    success: function(data) {
        if(data) {
            //alert success
        }
        else {
            //alert failure
        }
    }
    

    【讨论】:

    • 我刚刚添加了引号,它不适用于它们或在它们之前。这是个人联系人列表,我在表格下方有数据库输出。没有jquery,插入工作正常。我还查看了 phpmyadmin 中的数据库。但我会尝试你的建议。我确实得到“更新成功!”适应症
    • 你的意思是去掉引号?我会用你的 ajax 调用的外观来更新我的答案。
    • 它仍然告诉我调用是成功的,除了我没有启动控制器来做它应该做的插入。
    • 它实际上告诉你关于控制器的什么?在您插入之前,在您的控制器中, print_r($data);它应该准确地打印出 $data 中包含的内容,以便您知道信息是否正确传递。
    • 向我们展示确切的错误。没有它们,我们无法看到正在发生的事情。
    猜你喜欢
    • 2014-06-01
    • 2011-05-29
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2015-01-17
    相关资源
    最近更新 更多