我有一个浏览数据库记录的页面。查看者可以按类别,作者和标签过滤记录。我正在使用表单而不是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
。可以用来实现我正在尝试的东西吗?我不确定我是否走在正确的轨道上
答案 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的条目(请参阅转换为布尔值)。