doutang7383 2011-06-30 19:00
浏览 56
已采纳

Codeigniter省略了空标准的where子句

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

  • 写回答

1条回答 默认 最新

  • dstd2129 2011-06-30 19:10
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 ios可以实现ymodem-1k协议 1024字节传输吗?
  • ¥300 寻抓云闪付tn组成网页付款链接
  • ¥15 请问Ubuntu要怎么安装chrome呀?
  • ¥15 视频编码 十六进制问题
  • ¥15 Xsheii7我安装这个文件的时候跳出来另一个文件已锁定文件的无一部分进程无法访问。这个该怎么解决
  • ¥15 unity terrain打包后地形错位,跟建筑不在同一个位置,怎么办
  • ¥15 FileNotFoundError 解决方案
  • ¥15 uniapp实现如下图的图表功能
  • ¥15 u-subsection如何修改相邻两个节点样式
  • ¥30 vs2010开发 WFP(windows filtering platform)