0

我已经为这个问题挣扎了好几个小时。我有这个方法我的模型(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 时,我得到 '1'( String )($_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,但代码仍然无法正常工作。我认为这与$_POSTselect的 in html 或其他内容有关: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()在模型中,而不是在控制器中。所以我们不必调用模型的方法。

4

3 回答 3

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为and输入一些实际值,$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']);
    }
    */

}
于 2013-03-19T15:14:43.853 回答
1

将变量转换为整数。

$this->backend_m->get_umat((int)$_POST['ddl_kelas1'], (int)$_POST['ddl_kelas1']);
于 2013-03-19T14:19:20.097 回答
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();
}
于 2013-03-19T14:19:40.050 回答