CyberJunkie
CyberJunkie

Reputation: 22674

Codeigniter omit where clause for empty criterion

I have a page for browsing db records. The viewer can filter records by category, author, and tags. I'm using a form instead of url segments for filtering records (it feels more secure because I can validate inputs.)

For instance, when all form inputs are populated the query looks like this:

SELECT * FROM (`posts`) WHERE `category` = 'technolgy' AND `author` = 'lila' AND `tags` = 'ebook'

However if one input or more is empty, I get no results. For example:

SELECT * FROM (`posts`) WHERE `category` = '' AND `author` = 'lila' AND `tags` = '' 

I want the inputs to be optional so for example if just author name is entered, I can return records made by that author regardless of category and tags. How can I omit the and where clause if empty?

Note: or_where clause is not the solution because it doesn't return a precise query if all filter inputs all filled.

My Model

function filter($form_values)
    {                       
        $query = $this->db->get('posts');           
        $this->db->where($form_values); //adds clause to all array items
        return $query->result();        
    }

The function parameter is an array with input values from my view. Example,

$form_values = array('category' => $category, 'author' => $author, 'tags' => $tags);

and my View

$form_values = array (                  
                'category' => $this->input->post('category'),
                'author'   => $this->input->post('author'),
                'tags'     => $this->input->post('tags')
            );

$this->Records_model->filter($form_values);    

I know that in Codeigniter if $_POST' are empty they are set to FALSE. Can that be used to achieve what I'm trying? I'm not sure if I'm on the right track

Upvotes: 2

Views: 1573

Answers (1)

No Results Found
No Results Found

Reputation: 102745

You are correct that $this->input->post() will return FALSE if the $_POST value is not set. Unless you specifically want IS NULL to be part of the query (which I believe will happen by passing FALSE to param 2 of where(), not 100% sure), just filter out the empty values:

function filter($form_values)
{              
    $form_values = array_filter($form_values);

    // NOTE:
    // where() needs to be called first, or your query won't use the WHERE clause

    // You may need to make sure there is at least one value in $form_values
    if ( ! empty($form_values)) // however you wish to check for a value
    {
        $this->db->where($form_values); //adds clause to all array items
    }

    $query = $this->db->get('posts');           

    return $query->result();        
}

http://php.net/manual/en/function.array-filter.php

The important part to note on array_filter():

If no callback is supplied, all entries of input equal to FALSE (see converting to boolean) will be removed.

Upvotes: 1

Related Questions