Php 使用逗号分隔值的Codeigniter搜索
我试图使用codeigniter框架实现高级搜索。我有一个搜索框,其中有几个图标作为搜索基础。然后,如果用户试图找到一个图标,例如一个停车场的图标,它应该显示所有具有该图标的配置文件。如果用户点击更多图标,例如停车场、啤酒、情侣佳肴……只有具备这些特征的配置文件才会显示 数据库信息:Php 使用逗号分隔值的Codeigniter搜索,php,codeigniter,Php,Codeigniter,我试图使用codeigniter框架实现高级搜索。我有一个搜索框,其中有几个图标作为搜索基础。然后,如果用户试图找到一个图标,例如一个停车场的图标,它应该显示所有具有该图标的配置文件。如果用户点击更多图标,例如停车场、啤酒、情侣佳肴……只有具备这些特征的配置文件才会显示 数据库信息: ----------------------------------------------------- place_id icon_ids ------------------------
-----------------------------------------------------
place_id icon_ids
-----------------------------------------------------
1 1,2,3,4,5,6,7,8
2 1,2,3,7,9
3 1,3,4
4 1,2,4,5,9,10
5 1,2,3,5,6,8,9,10
-----------------------------------------------------
型号
public function get_search_content($info_id, $search_queries, $query_type, $limit, $start, $action_type)
{
if($query_type === 'icons')
{
$count_id = explode(',', $info_id);
$count_id = count($count_id);
if($count_id > 1)
{
$search = "lai.info_id IN (".$info_id.")";
$query = $this->db->select('*, c.id AS cat_id, bh.id AS hour_id, bh.place_id AS bh_place_id, c.name AS cat_name, l.place_id AS place_id, lai.place_id AS lai_place_id')
->where($search)
->join('listing_additional_info lai', 'lai.place_id=l.place_id', 'LEFT')
->join('cities cy', 'cy.city_id=l.city_id', 'LEFT')
->join('cats c', 'c.parent_id=l.cat_id', 'LEFT')
->join('business_hours bh', 'bh.place_id=l.place_id', 'LEFT')
->group_by('lai.place_id', 'ASC')
->limit($limit, $start)
->get('listings l');
}
else
{
$search = "FIND_IN_SET('".$info_id."', lai.info_id)";
$query = $this->db->select('*, c.id AS cat_id, bh.id AS hour_id, bh.place_id AS bh_place_id, c.name AS cat_name, l.place_id AS place_id, lai.place_id AS lai_place_id')
->distinct()
->where($search)
->join('listing_additional_info lai', 'lai.place_id=l.place_id', 'LEFT')
->join('cities cy', 'cy.city_id=l.city_id', 'LEFT')
->join('cats c', 'c.parent_id=l.cat_id', 'LEFT')
->join('business_hours bh', 'bh.place_id=l.place_id', 'LEFT')
->group_by('lai.place_id', 'ASC')
->limit($limit, $start)
->get('listings l');
}
}
}
public function m_search_queries($limit, $start)
{
// $info_id = $this->input->get('info_id');
$info_id = $this->input->get('info_id_');
$search_queries = $this->input->get('q');
$submit_search = $this->input->get('submit_search');
if($submit_search == 'true')
{
if(!empty($info_id))
{
echo $this->get_search_content($info_id, $search_queries, 'icons', $limit, $start, 'content');
}
elseif(!empty($search_queries))
{
echo $this->get_search_content($info_id, $search_queries, 'input', $limit, $start, 'content');
}
else
{
$rs = '';
$rs .= '<div class="bg bg-info text-white p-3">Sorry, we could not find what you are looking for.</div>';
echo $rs;
}
}
}
公共函数获取搜索内容($info\u id、$search\u querys、$query\u type、$limit、$start、$action\u type)
{
如果($query_type==='icons')
{
$count_id=分解(“,”,$info_id);
$count\u id=count($count\u id);
如果($count\u id>1)
{
$search=“lai.info\u id IN(“.$info\u id.”)中的“;
$query=$this->db->select('*,c.id作为cat\u id,bh.id作为hour\u id,bh.place\u id作为bh\u place\u id,c.name作为cat\u name,l.place\u id作为place\u id,lai.place\u id作为lai\u place\u id'))
->where($search)
->加入('listing\u additional\u info lai','lai.place\u id=l.place\u id','LEFT')
->加入('cities cy','cy.city\u id=l.city\u id','LEFT')
->加入('cats c','c.parent\u id=l.cats\u id','LEFT')
->加入('business\u hours bh','bh.place\u id=l.place\u id','LEFT')
->分组人('lai.place\u id','ASC')
->限额($limit$start)
->获取('l');
}
其他的
{
$search=“在集合中查找(“$info\u id.”,lai.info\u id)”;
$query=$this->db->select('*,c.id作为cat\u id,bh.id作为hour\u id,bh.place\u id作为bh\u place\u id,c.name作为cat\u name,l.place\u id作为place\u id,lai.place\u id作为lai\u place\u id'))
->不同的()
->where($search)
->加入('listing\u additional\u info lai','lai.place\u id=l.place\u id','LEFT')
->加入('cities cy','cy.city\u id=l.city\u id','LEFT')
->加入('cats c','c.parent\u id=l.cats\u id','LEFT')
->加入('business\u hours bh','bh.place\u id=l.place\u id','LEFT')
->分组人('lai.place\u id','ASC')
->限额($limit$start)
->获取('l');
}
}
}
公共函数m_搜索_查询($limit,$start)
{
//$info_id=$this->input->get('info_id');
$info_id=$this->input->get('info_id');
$search_querys=$this->input->get('q');
$submit_search=$this->input->get('submit_search');
如果($submit\u search=='true')
{
如果(!空($info_id))
{
echo$this->get_search_content($info_id,$search_querys,'icons',$limit,$start,'content');
}
elseif(!empty($search\u querys))
{
echo$this->get_search_content($info_id,$search_querys,'input',$limit,$start,'content');
}
其他的
{
$rs='';
$rs.=“对不起,我们找不到您要找的内容。”;
echo$rs;
}
}
}
查看
<form method="GET" action="<?= base_url().lang(); ?>/search" class="">
<div class="mb-2" id="add-data-info">
<?php for($i=1; $i<=13; $i++){ ?>
<div class="btn add_selector search_add_selector search_add_selector_<?= $i; ?> search_add_info_view">
<input type="checkbox" value="<?= $i; ?>" class="search_add_info">
<img id="" class="svg" src="<?= base_url(); ?>theme/myown/img/icon/svg/<?= $i; ?>.svg?<?= time(); ?>" width="28">
</div>
<?php } ?>
<div class="my-2">
<div class="w-100 border border-muted my-4"></div>
<input type="hidden" name="query_type" value="icons">
<button type="submit" name="submit_search" class="btn btn-info btn-lg btn-rounded" value="true">Search</button>
</div>
</div>
<input type="hidden" id="search_selected_additional" name="info_id_">
</form>
我已经创建了它,并在我的环境中进行了测试,它就像一个魔咒:
$this->db->select('whatever')->from('your_table');
$this->db->group_start();
foreach($selected_values as $value)
{
$this->db->where("find_in_set($value, icon_ids)");
}
$this->db->group_end();
$result = $this->db->get()->result_array();
我用你的值再次测试了它,它在(1,2,5)上运行得很好,它显示(1,4,5)我想你必须重新设计你的数据库,目标是n:m关系模型看看这里()-你的设计被认为是非常糟糕的-因为你没有使用现代RDBMS的优点(你正在打破第一个正常形式…)-如果您拒绝并希望保留您的版本-无论出于何种原因-请查看此处可能的@sintakonte副本谢谢您的回复。我转到了您提供的链接。你能给我至少一个示例代码吗。我不太明白这一点:WHERE CONCAT(“,”,
setcolumn,“,”)REGEXP“,(val1 | val2 | val3),“
在我这方面似乎不起作用。我真的是这个框架的新手。谢谢!我的模型中有以下代码:$search=“FIND_in_SET”(“$info_id.”,lai.info_id)”$query=$this->db->select('*,CONCAT(,“,”lai.info_id“,”,“,”)REGEXP“,('.$info_id.'.$info_id.'.'.$info_id.'),”)->where($search)->group_by('lai.place_id',ASC')->limit limit($limit,$start)->get('listings l')
@johnlopev this当CONCAT(“,”,
setcolumn,“,”)REGEXP“,(val1 | val2 | val3),“
在mySQL上时,您需要将这三个值传递到一个查询中,这对CodeIgniter来说并不特殊。。它是纯PHP。话虽如此,我强烈建议您重新思考并重新建模您的数据库,以更好地利用您的RDBMS。。。最好现在就做,早一点,而不是晚一点,那时你会经历更多的痛苦(见@sintakonte的第一条评论)哦!。。我想它起作用了我只是他妈的没意识到它起作用了!谢谢兄弟!你救了我一天!:D
$this->db->select('whatever')->from('your_table');
$this->db->group_start();
foreach($selected_values as $value)
{
$this->db->where("find_in_set($value, icon_ids)");
}
$this->db->group_end();
$result = $this->db->get()->result_array();