Codeigniter省略了空标准的where子句

时间:2011-06-30 19:00:01

标签: php mysql database arrays codeigniter

我有一个浏览数据库记录的页面。查看者可以按类别,作者和标签过滤记录。我正在使用表单而不是url段来过滤记录(感觉更安全,因为我可以验证输入。)

例如,当填充所有表单输入时,查询如下所示:

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

但是,如果一个或多个输入为空,则不会得到任何结果。例如:

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

我希望输入是可选的,例如,如果只输入author name,我可以返回该作者创建的记录,而不管类别和标记。如果为空,我如何省略and where子句?

注意:or_where子句不是解决方案,因为如果所有过滤器输入全部填充,它就不会返回精确的查询。

我的模特

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

function参数是一个包含我视图输入值的数组。例如,

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

和我的观点

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

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

我知道在Codeigniter中如果$_POST'为空,则设置为FALSE。可以用来实现我正在尝试的东西吗?我不确定我是否走在正确的轨道上

1 个答案:

答案 0 :(得分:1)

如果未设置$this->input->post()值,则FALSE将返回$_POST,这是正确的。除非您特别希望IS NULL成为查询的一部分(我相信会将FALSE传递给where()的参数2,而不是100%肯定) ,只过滤掉空值:

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

关于array_filter()注意的重要部分:

  

如果没有提供回调,则将删除所有输入等于FALSE的条目(请参阅转换为布尔值)。