0

我正在尝试使用codeigniter中的ajax将数据从我的数据库中获取到我的视图中,但我无法让它工作。我认为将grade_id 传递给我的模型函数时出了点问题。

阿贾克斯:

<script type="text/javascript">
    $(document).ready(function(){    
        $('#grades').change(function(){          
            $("#classes > option").remove(); 
            var grade_id = $('#grades').val();  
            $.ajax({
                type: "POST",
                url: "<?php echo base_url(); ?>index.php/login/get_classes/"+grade_id, 
                data: {gradeid:grade_id},
                success: function(classes) 
                {
                    $.each(classes,function(id,name) 
                    {
                        var opt = $('<option />'); 
                        opt.val(id);
                        opt.text(name);
                        $('#classes').append(opt); 
                    });
                }        
            });

        });
    });
</script>

控制器:

 function get_classes($gradeid)
{
    $this->load->model('school_info_model');
    header('Content-type: application/json');

    if ($query = $this->school_info_model->get_all_classes($gradeid))
    {
        echo json_encode($query);
    } else {
        redirect('login/loginform');
    }

}

模型:

function get_all_classes($gradeid)
{

    $this->db->where('grade_id', $gradeid);

    $query = $this->db->get('classes');

    if($query->result()){
        $result = $query->result();

        foreach($result as $row)
        {
            $options[$row->id] = $row->name;
        }   
        return $options;
    } 
}

编辑:

我更新了我现在正在工作的代码,除了两件事,我一直收到错误。

错误:

遇到 PHP 错误

严重性:警告

消息:为 foreach() 提供的参数无效

文件名:helpers/form_helper.php

行号:331

当我第一次加载页面时,类的输入字段是空的,因为它只有在等级值发生变化时才会激活 AJAX。

4

4 回答 4

1

我会这样设置我的控制器:

function get_classes()
{
    $this->load->model('school_info_model');

    if ($gradeid = $this->input->post('gradeid')
    {
        $query = $this->school_info_model->get_all_classes($gradeid);
        header('Content-Type: application/json');
        echo json_encode($query);
    } else {
        redirect('some/controller');
    }

}

我会改变我的 JS 像这样工作:

<script type="text/javascript">// <![CDATA[
    $(document).ready(function(){       
        $('#grades').change(function(){
            $("#classes > option").remove();
            var grade_id = $('#grades').val();
            $.ajax({
                type: "POST",
                url: "<?php echo base_url(); ?>index.php/login/get_classes/",
                data: {gradeid:grade_id},
                success: function(classes)
                {
                    $.each(classes,function(id,name)
                    {
                        var opt = $('<option />');
                        opt.val(id);
                        opt.text(name);
                        $('#classes').append(opt);
                    });
                }        
            });

        });
    });
    // ]]>
</script>

我不确定这是否正是你想要的,但它应该让你更接近。

于 2013-10-13T17:24:12.240 回答
1

不要将它作为参数传递给您的控制器,而是尝试序列化该值并在您的脚本中使用它。

var grade_id = $("#grades").serialize();

data: grade_id

在你的控制器中,

$grade_id = $this->input->post('grade_id');

这应该工作!

于 2013-10-13T17:59:22.207 回答
1

如果您一开始没有得到结果正文,那么json_encode很可能只是返回 FALSE。

只是要指出,您在模型函数的第一个 if 子句中有一个比较错误

if($gradeid = NULL){
    $this->db->where('grade_id', $gradeid);
}

编辑...等等,嗯,你的作业测试风格让我感到困惑。我的意思是,这个 where 子句永远不会执行。

此外,如果在您的控制器中也没有找到任何类,您可能会考虑返回空$options列表,因为理论上(不知道您的应用程序)这似乎是有道理的。

明确告诉您的 AJAX 调用它需要 JSON 数据可能不是必需的,但可能会有所帮助,即添加dataType: "JSON"为设置。

编辑以响应您的表单错误:您得到的错误是一个标准的 php 错误,它基本上表示 foreach 循环得到了错误的参数.. 可能您没有将数组传递给它。为此,您必须login/loginform分别检查其视图。但我不确定你的意图是什么?如果他/她/它没有收到预期的数据,将用户转发到登录表单?你在你的 AJAX 请求中处理这个问题吗?就像现在一样,您的 AJAX 请求只会被重新路由到可能不是有效 JSON 的东西,但浏览器的位置不会改变。

于 2013-10-13T18:09:42.553 回答
0

您应该在数组中定义 $option。

function get_all_classes($gradeid)
 {
$this->db->where('grade_id', $gradeid);

$query = $this->db->get('classes');

$options = array();

if($query->result()){
    $result = $query->result();

    foreach($result as $row)
    {
        $options[$row->id] = $row->name;
    }   
    return $options;
  } 
}
于 2017-01-27T08:06:30.380 回答