2013-08-23 59 views
2

我已經在很多購物網站上看到他們有側面的搜索過濾器,並且您可以添加任意數量的過濾器,並研究僅顯示匹配所有過濾器查詢。作爲一個例子,如果你去ebay並尋找一臺計算機,你可以過濾計算機的各種規格來縮小結果。php/mysql搜索表與未知數量的過濾器

我遇到的問題是如何爲具有許多字段以供用戶搜索的表執行此操作。

我有一個屬性表,我想通過任意數量的參數搜索例如租金,位置等。

我可以爲每個可能的選項創建搜索查詢,例如, searchByAddress($array)searchByAddressAndRent($array)等,但這顯然不可行。

的另一種方式,我可以爲每個字段創建單獨的查詢,然後觸發對於每個參數即searchByRent($array)searchByAddress($array)單獨搜索查詢,並允許PHP應用程序來計算哪些字段使用array_intersect在所有得到的陣列是常見的。

但我想知道,必須有一個適當的技術來實現這一點。這個問題有點冗長,我從Google上找不到任何教程。

所以我的問題是,什麼是「正確」的方法/搜索數據庫表與各種搜索過濾器?

+0

如果您花時間閱讀問題並進行了表決,請評論我應該如何改進問題。謝謝。 – Ozzy

+0

我相信他們正在實施某種[EAV](http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model)。它也有其缺點。請參閱[如何構建大型表單應用程序?](http://stackoverflow.com/q/17745114)在本網站上閱讀關於它的一些信息。 –

+0

@MadaraUchiha我無法理解EAV結構如何幫助搜索單個實體將其字段與可變數量的值進行匹配?是否因爲在EAV模型中有一個巨大的表,帶有'屬性'和'值'列,所以你只需要搜索'屬性'來匹配不同的值呢? – Ozzy

回答

1

如果您創建了表示屬性表的類,則可以在類中定義一個靜態數組,詳細說明每個字段名稱和相應的數據類型。

在前端,每​​個搜索字段應該對應數據庫中的列名,所以$ _REQUEST數組鍵將與列名匹配。

之後,遍歷您的搜索數組,檢查每個變量是否存在於您的類字段定義數組中,並將其添加到搜索查詢中。

下面是一個非常簡單的示例類,希望能給你提供一個想法。

class Property() { 

    // search parameters come from $values_array 
    // each search field should correspond to the $field_definitions key 
    public function search($values_array = null) { 

     // populate the values array. Using this method meads you can pass an array directly 
     // into the search function, or you can rely on the $_REQUEST 
     $values_array = self::getValuesArray($values_array); 

     // setup the initial query 
     $query = "SELECT * FROM properties"; 
     // set our initial join string 
     $join = "WHERE"; 

     // loop each of our search values 
     foreach ($values_array as $field=>$value) { 
      // check the search key exists in our table definition and it's not empty 
      if (array_key_exists($field_definitions, self::$fields) && !empty($value)) { 
       // switch the datatype for the field so we can set the appropriate query string 
       switch (self::$field_definitions[$field]) { 

        case 'int': 
         $query .= "$join $field = {$value} "; 
         $join = "AND"; 
         break; 

        default: 
         $query .= "$join $field = '%{$value}%' "; 
         $join = "AND"; 
         break; 
       } 
      } 
     } 

     // now execute the query... 
     $results = mysql_query($query); 

     // do something to process the results and then return 

     return $results; 
    } 

    // basic function to grab our values from $_REQUEST if passed an empty array 
    private function getValuesArray($values_array = null) { 

     $values_array = (!empty($values_array)) ? $values_array : $_REQUEST; 
     return $values_array; 
    } 

    // variable containing all available fields in table and corresponding datatype 
    public static $field_definitions = 
     array( 'number'=>'int', 
      'street'=>'string', 
      'locality'=>'string', 
      'townland'=>'string', 
      'town'=>'string', 
      'postcode'=>'string' 
     ); 
} 
+0

對,所以我動態地構建SQL查詢,明白了!我也想知道如何處理字段定義,因爲如果'int'不是種類'int'那麼真的太棒了,謝謝:),這有時候是PDO的問題。 – Ozzy