我几个小时都在努力解决这个问题。我有这个方法我的模型(codeigniter):
public function get_umat($kelas1 = 0, $kelas2 = 0) {
$this->db->select('*');
$this->db->from('msumat');
$this->db->join('mskelas', 'msumat.kelas_id = mskelas.kelas_id');
if($kelas1 != 0)
{
echo $kelas1;
var_dump($kelas1);
$this->db->where('mskelas.kelas_id', $kelas1);
}
else if($kelas2 !=0)
{
echo '2';
$this->db->where('mskelas.kelas_id', $kelas2);
}
else if($kelas1 != 0 && $kelas2 !=0)
{
echo '3';
$this->db->where('mskelas.kelas_id BETWEEN $kelas1 AND $kelas2');
}
return $this->db->get();
}
编辑: 不工作的是在这行代码中(取自上面):
$this->db->where('mskelas.kelas_id', $kelas1);
当我在我的控制器中调用此方法时,不正在工作,如下所示:
$this->backend_m->get_umat($_POST['ddl_kelas1'], $_POST['ddl_kelas1']);
当我vardump ($_POST['ddl_kelas1']
然后我尝试更改控制器中的参数,但仍然不正在工作:
$this->backend_m->get_umat(1, $_POST['ddl_kelas1']);
绝望地,我试图直接在模型中更改参数及其工作:
public function get_umat($kelas1 = 1, $kelas2 = 0)
这里发生了什么?我认为它与1(int)和'1'(String)的区别有关。谢谢:D
编辑2: 经过一些实验,我认为变量类型不是问题所在。那是因为 : 我尝试在控制器:
中执行此操作 if(isset($_POST['btnSearch']))
{
$test = (int)$_POST['ddl_kelas1'];
$this->backend_m->get_umat($_POST['ddl_kelas1'] , $_POST['ddl_kelas1']);
}
这在我的模型中:
if((int)$kelas1 != 0)
{
echo $kelas1;
var_dump($kelas1);
$this->db->where('mskelas.kelas_id', $kelas1);
}
我得到的是,$kelas1
现在已经是一个int,但代码仍然不正常工作。我认为这与html中的$_POST
中的select
或其他内容有关:D
但是,此代码仍然可以正常工作(就像上面一样,我手动将参数更改为1(整数)):
public function get_umat($kelas1 = 1, $kelas2 = 0)
这是我的完整控制器代码:
public function index() {
//table
$data_umat = $this->backend_m->get_umat()->result();
$this->table->set_heading(
'No',
'Nama',
'Kelas',
'Alamat',
'Sekolah',
'Nomor Telepon',
'Keterangan'
);
$table_template = array('table_open' => '<table border="1" id="custom_table">');
$this->table->set_template($table_template);
$no = 1;
foreach($data_umat as $list_temp)
{
$this->table->add_row(
$no++,
$list_temp->nama,
$list_temp->kelas,
$list_temp->alamat,
$list_temp->sekolah,
$list_temp->no_tlpn,
$list_temp->keterangan
);
}
$data_kelas = $this->backend_m->get_kelas()->result();
$data['list_kelas'][0] = 'Pilih Kelas';
foreach($data_kelas as $row)
{
$data['list_kelas'][$row->kelas_id] = $row->kelas;
}
$data['table'] = $this->table->generate();
$this->load->view('backend/home_v', $data);
if(isset($_POST['btnSearch']))
{
//$test = (int)$_POST['ddl_kelas1'];
$test = (int)$this->input->post('ddl_kelas1');
$this->backend_m->get_umat($test , $_POST['ddl_kelas1'], $_POST['txtNama']);
}
}
相当令人困惑,是吗?
对于那些有同样问题的人来说很容易回答
在模型中使用$_POST
或$this->input->post()
,在控制器中使用不是。所以我们不必须调用模型的方法。
答案 0 :(得分:1)
将变量转换为整数。
$this->backend_m->get_umat((int)$_POST['ddl_kelas1'], (int)$_POST['ddl_kelas1']);
答案 1 :(得分:1)
您将选择与字符串匹配的数据,尝试转换该值以获取正确的数据:
public function get_umat($kelas1 = 0, $kelas2 = 0) {
$kelas1 = (int)$kelas1;
$kelas2 = (int)$kelas2;
$this->db->select('*');
$this->db->from('msumat');
$this->db->join('mskelas', 'msumat.kelas_id = mskelas.kelas_id');
if($kelas1 != 0)
{
echo $kelas1;
var_dump($kelas1);
$this->db->where('mskelas.kelas_id', $kelas1);
}
else if($kelas2 !=0)
{
echo '2';
$this->db->where('mskelas.kelas_id', $kelas2);
}
else if($kelas1 != 0 && $kelas2 !=0)
{
echo '3';
$this->db->where('mskelas.kelas_id BETWEEN $kelas1 AND $kelas2');
}
return $this->db->get();
}
答案 2 :(得分:1)
仔细检查if语句中的表达式:
if((int)$kelas1 != 0)
{...}
else if((int)$kelas2 !=0)
{...}
else if((int)$kelas1 != 0 && (int)$kelas2 !=0)
{...}
添加(int)
以确保将整数与整数(或字符串与字符串)进行比较。同样的想法适用于构建SQL语句。
调试策略 请尝试以下一个或多个想法:
(1)确保将整数传递到get_mat
函数:
public function get_umat((int)$kelas1 = 0, (int)$kelas2 = 0) {...)
(2)确保传递硬编码值时get_umat
有效:
get_umat(0,0);
get_umat(1,0);
get_umat(0,1);
get_umat(1,1);
在每种情况下,请检查以确保选择了正确的WHERE
子句。
另外:回显你的SQL语句并仔细检查它的语法。尝试类似:
$the_sql_query_string = $this->db->last_query();
并回显/查看$the_sql_query_string
---------------代码建议--------------------------- -------------------------------------------------- ---
我对代码提出了一些建议。为$kelas1
和$kelas2
添加一些实际值,并确保输出看起来正确。
public function index() {
// Select all or filtered set of records
if(isset($this->input->post('btnSearch'))
{
//$test = (int)$_POST['ddl_kelas1'];
//$test = (int)$this->input->post('ddl_kelas1');
$kelas1 = 101; // put in a relevant id
$kelas2 = 201; // put in a second relevant id
// In term, try the following:
$this->backend_m->get_umat($kelas1,$kelas2);
}
$data_umat = $this->backend_m->get_umat()->result();
$this->table->set_heading(
'No',
'Nama',
'Kelas',
'Alamat',
'Sekolah',
'Nomor Telepon',
'Keterangan'
);
$table_template = array('table_open' => '<table border="1" id="custom_table">');
$this->table->set_template($table_template);
$no = 1;
foreach($data_umat as $list_temp)
{
$this->table->add_row(
$no++,
$list_temp->nama,
$list_temp->kelas,
$list_temp->alamat,
$list_temp->sekolah,
$list_temp->no_tlpn,
$list_temp->keterangan
);
}
$data_kelas = $this->backend_m->get_kelas()->result();
$data['list_kelas'][0] = 'Pilih Kelas';
foreach($data_kelas as $row)
{
$data['list_kelas'][$row->kelas_id] = $row->kelas;
}
$data['table'] = $this->table->generate();
$this->load->view('backend/home_v', $data);
// This will not do anything since you have already rendered the page
// This should be at the top of the code
/*
if(isset($_POST['btnSearch']))
{
//$test = (int)$_POST['ddl_kelas1'];
$test = (int)$this->input->post('ddl_kelas1');
$this->backend_m->get_umat($test , $_POST['ddl_kelas1'], $_POST['txtNama']);
}
*/
}