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」(文字列)が表示されます($_POST['ddl_kelas1']

次に、コントローラーのパラメーターを変更しようとしましたが、それでも機能しません

 $this->backend_m->get_umat(1, $_POST['ddl_kelas1']);

必死に、私はモデルで直接パラメータを変更しようとしました、そしてその動作

public function get_umat($kelas1 = 1, $kelas2 = 0)

ここで何が起こっているのでしょうか?1(int)と「1」(String)の違いと関係があると思います。ありがとう

編集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の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

変数を整数としてキャストします。

$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 に答える
1

ifステートメントの式を再確認してください。

if((int)$kelas1 != 0)
{...}
else if((int)$kelas2 !=0)
{...}
else if((int)$kelas1 != 0 && (int)$kelas2 !=0)
{...}

を追加して、(int)整数と整数(または文字列と文字列)を確実に比較します。同じ考え方がSQLステートメントの作成にも当てはまります。

デバッグ戦略 次のアイデアの1つ以上を試してください。

(1)整数がget_mat関数に渡されていることを確認します。

public function get_umat((int)$kelas1 = 0, (int)$kelas2 = 0) {...)

get_umat(2)ハードコードされた値を渡すときにそれが機能することを確認します。

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

}
于 2013-03-19T15:14:43.853 に答える