phpcodeignitermodel-view-controlleractiverecordwhere-clause

Codeigniter SELECT query WHERE a combination of user-submitted filters


I just want to make my CodeIgniter filter form work. For example, if "Samsung" is selected from the dropdown list and "2G" from the checkbox fields, then rows with id 1 and 4 should be returned. Currently my model returns nothing. I think the problem is in the if statement of the model, but I cannot find out what is the exact reason.

Here is my database table:

database table

Here is my filter form:

filter form

Here is My Model:

<?php
if (!defined('BASEPATH')) {
    exit('No direct script access allowed');
}
        
class Model_example extends CI_Model
{
    function __construct()
    { 
        parent::__construct();
    }
        
    public function did_filter()
    {
        $types = $this->input->post('types');
        
        $data = array(
            '2g' => 0,
            '3g' => 0,
            '4g' => 0,                
        );                  
        foreach ($types as $type) {
            $data[$type] == 1;
        }
        $this->db->select('*');
        $this->db->from('table_example');
        $this->db->where('phone', $this->input->post('phone'));
               
        if ($query = $this->db->get()) {
            if (
                (('2g' == 1) AND ($data['2g'] == 1)) OR
                (('3g' == 1) AND ($data['3g'] == 1)) OR  
                (('4g' == 1) AND ($data['4g'] == 1))
           ) {               
               return $result = $query->result_array();
           } else {
               return false;
           }            
       } else {
           return false;
       }
    }  
}

Here is My View number 1:

<?php 
$this->load->helper("form", "file");
echo validation_errors();              
echo form_open_multipart("example/search");
    
echo form_label("Phone:<br>", "phone");
$data = array(
    "" => "Select Phone",
    "samsung" => "Samsung",
    "htc" => "HTC",
    "nokia" => "Nokia",
);
echo form_dropdown('phone', $data, set_value('phone'));
    
echo br(5);
?> 
    
<?php echo form_label("Network Type:<br>", "type"); ?>                   
<input type="checkbox" name="types[]" value="2g" id="types" <?php echo set_checkbox('types[]', '2g', FALSE); ?>/>2G<br />
<input type="checkbox" name="types[]" value="3g" id="types" <?php echo set_checkbox('types[]', '3g', FALSE); ?>/>3G<br />
<input type="checkbox" name="types[]" value="4g" id="types" <?php echo set_checkbox('types[]', '4g', FALSE); ?>/>4G<br />
<br />

<?php
echo br(1);
echo form_submit("filterSearch", "Search");
    
echo form_close();
?>

Here is My View number 2:

<?php 
print_r($result);

Here is my controller:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
class Example extends MX_Controller {
    public function index() { //main function
        $this->load->view("view_example");
    }
    
    public function search() { 
        $this->load->library('form_validation');
        $this->load->model('model_example');
    
        $this->form_validation->set_rules('phone', 'Phone', 'required');
        $this->form_validation->set_rules('types[]', 'Network Type', 'required'); 
    
        if ($this->form_validation->run()) {
            $data["result"] = $this->model_example->did_filter();
            $this->load->view("view_search_results", $data); 
        } else {
            $this->load->view("view_no_search_results");
        }
    }
}

Solution

  • Try this, it should work, i gave you two option for where so use the one that you need

     public function did_filter() {
    
        $types = $this->input->post('types');
    
        //list of types column name you can ignore this part by in cases someone change the value in html your query will fail so i am keeping this
        $data = array(
            '2g' => 0,
            '3g' => 0,
            '4g' => 0,
        );
    
        $this->db->select('*');
        $this->db->from('table_example');
        $this->db->where('phone', $this->input->post('phone'));
    
        // if you want to use and where use this block, or use the next block the is commented out
        foreach ($types as $type) {
            if (isset($data[$type])) { // this making sure that your column is correct 
                $this->db->where($type, 1);
            }
        }
    
        /**
        //If you want your checkbox to work as or, ie if 2g and 3g select and you want to show any check box match. 
        //In case of your example still it will give row 1 and 4, but if you use fist block it will give you row 1 only because row 1 got both 2g and 3g
        $or_where = array();
        foreach ($types as $type) {
            if (isset($data[$type])) { // this makeing sure that your colum is correct 
                $or_where[] = "$type = 1";
            }
        }
        if (count($or_where) > 0) {
            $where = implode(' OR ', $or_where); // make the or where for array
            $this->db->where("($where)");
        }
         * 
         */
    
        $query = $this->db->get();
    
        if ($query && $query->num_rows() > 0) {
            return $query->result_array();
        } else {
            return false;
        }
    }