我在搜索表单中有多个字段。每个字段都可以为空。 我构建这样的查询:
$search_title = trim($_POST["search_title"]);
$search_skill = trim($_POST["search_skill"]);
$search_company = trim($_POST["search_city"]);
$search_country_id = trim($_POST["search_county_id"]);
$hits = $index->find("title:$search_title and skill:$search_skill and city:$search_city and country_id:$country_id");
用户只能填写标题或技能或城市等,但如果某个字段为空,则我没有结果。 只有填写并匹配所有字段时才会生成结果。 如果只填充一个字段,我不会得到结果,如果为null则忽略该字段:
$hits = $index->find("title: and skill: and city: and country_id:$country_id");
答案 0 :(得分:0)
if ($this->getRequest()->isPost()) {
if ($form->isValid($this->getRequest()->getPost)) {
//get filtered and valid values from search form.
//filter the array for set values
$data = array_filter($form->getValues());
//extract key => vaules as $variable = values
extract($data);
$query1 = new Zend_Search_Lucene_Search_Query_MultiTerm();
//test for variable isset and add term to query
if (isset($search_title)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_title, 'title'));
}
if (isset($search_skill)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_skill, 'skill'));
}
if (isset($search_city)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_city, 'city'));
}
if (isset($search_country_id)){
$query1->addTerm(new Zend_Search_Lucene_Index_Term($search_country_id, 'country_id'));
}
//This should give the AND you are looking for...I hope
$query= new Zend_Search_Lucene_Search_Query_Boolean(array($query1), array(TRUE));
//get result set from query
$hits = $index->find($query);
}
}
如果您在表单中使用StringTrim
过滤器,则无需在数据上使用trim()
函数。 $ _POST数组对于用户提供的数据是危险的,ZF提供getValues()
系列方法来提供来自请求对象(POST和GET)的数据,这些数据包含您指定应用的过滤器和验证器。
我在此实例中使用了extract()
函数,因为我使用了getValues()
,因此数据已经过滤和验证。当然还有其他有效的方法可以将key => value
对分配给变量。使用你最喜欢的。