我正在尝试使用codeigniter中的ajax从我的数据库中获取数据到我的视图,但我无法使其工作。我认为将grade_id传递给我的模型函数会出错。
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件事,我一直收到错误。
错误:
遇到PHP错误
严重性:警告
消息:为foreach()提供的参数无效
文件名:helpers / form_helper.php
行号:331
当我第一次加载页面时,类的输入字段为空,因为只有当成绩的值发生变化时,它才会激活AJAX。
答案 0 :(得分: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>
我不确定这是不是你想要的地方,但是它会让你更接近。
答案 1 :(得分:1)
不要将其作为参数传递给控制器,而是尝试序列化该值并在脚本中使用它。
var grade_id = $("#grades").serialize();
和
data: grade_id
在你的控制器中,
$grade_id = $this->input->post('grade_id');
这应该有效!
答案 2 :(得分: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,但浏览器的位置不会改变。
答案 3 :(得分: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;
}
}