2012-03-19 3 views
0

У меня есть несколько полей в форме поиска. Каждое поле может быть пустым. я построить запрос, как это:Возвращает результаты, когда параметры поиска равны нулю. I Zend Lucene

$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"); 

Пользователь может заполнить только название или навык или города и т.д., но если какое-то поле пусто у меня нет никакого результата. У меня есть результат, только если все поля заполнены и сопоставлены. я не буду результатов, если только одно поле заполнено, если равно нулю игнорировать это поле:

$hits = $index->find("title: and skill: and city: and country_id:$country_id");  
+0

Посмотрите на этот похожий вопрос Я ответил ранее для идей: http://stackoverflow.com/questions/9764950/mysql-updating-some-database-fields-without-overwriting-fields-not-changed/9765118#9765118 –

ответ

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. Используйте свой любимый.

+0

Этот запрос возвращает все: search_title OR search_skill OR search_city и т. Д., Но мне нужен search_title AND search_skill и т. Д. –

+0

проверить редактирование, оно должно быть действительно близко. – RockyFord

Смежные вопросы