2013-10-13 112 views
0

我想从我的数据库中获取数据到我的视图在codeigniter中使用ajax,但我无法让它工作。我认为将grade_id传递给我的模型函数会出现问题。从代码数据库中使用AJAX获取数据

AJAX:

<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'); 
    } 

} 

MODEL:

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; 
    } 
} 

编辑:

我更新了我的代码现在正在工作,除了2件事情,我不断收到一个错误。

错误:

A PHP Error was encountered

Severity: Warning

Message: Invalid argument supplied for foreach()

Filename: helpers/form_helper.php

Line Number: 331

,当我加载页面,第一次上课的输入栏是空的,因为它只能激活AJAX如果等级变化的值。

+1

它返回什么错误? – WebNovice

回答

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> 

我不知道如果这正是你想要是的,但它应该让你更接近。

+0

实际上,在CI控制器中返回数据不会*工作。回声应该工作得很好,但它会绕过CI控制器的视图缓冲和最终输出过滤。最有可能的问题json_encode只是返回FALSE – Filou

+0

你是对的...它应该是回声...忘了这一点。一次想到很多事情。我会更新答案。 – kevindeleon

1

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

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

data: grade_id 

而在你的控制器,

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

这应该工作!

1

如果你没有得到结果体,那么json_encode很可能只是返回FALSE。

只是想指出,你有你的模型的功能

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

编辑...等,MHM,你的任务测试风格困惑我的第一个if子句中的比较错误。我的意思是,这个where子句永远不会被执行。

此外,如果在您的控制器中找不到类,那么您可以考虑返回空的$options列表,这在理论上(不知道您的应用程序)是否合理。

明确告诉你的AJAX调用它可能并不需要JSON数据,但可能会有所帮助,例如添加dataType: "JSON"作为设置。

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

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; 
    } 
} 
相关问题