2011-05-07 20 views
0

我正在使用CodeIgniter進行搜索,它將查詢數據庫。如果用戶只填寫一個字段,則MySQL查詢不起作用

這三個字段分別是「位置」(下拉列表),「日期」(日期)和「事件類型」(下拉列表)。

我目前使用的代碼是:

public function search_flyers($location, $date) { 
    $date = $this->utils_model->get_sql_date($date); 
    $query = $this->db->query("SELECT *, flyers.fid FROM flyers 
       LEFT JOIN event_dates ON flyers.fid = event_dates.fid 
       WHERE ((flyers.interval='weekly' 
        AND DATEDIFF('" . $date . "',flyers.start_date)%7=0 
        AND '" . $date . "' <= flyers.end_date) 
        OR (flyers.interval='fornightly' 
        AND DATEDIFF('" . $date . "',flyers.start_date)%14=0 
        AND '" . $date . "' <= flyers.end_date) 
        OR (flyers.interval='manual' 
        AND event_dates.date = '" . $date . "' 
        OR flyers.start_date = '".$date."' 
        AND '".$date."' <= flyers.end_date) AND flyers.approved = 1) 
       AND flyers.location = '".$location."' 
       GROUP BY flyers.fid 
       ORDER BY flyers.start_date ASC"); 

    $data['flyers'] = $query->result(); 
    $data['rows'] = $query->num_rows(); 

    return $data; 

提到的「間隔」字段一起被使用的事件日期摸出如果事件落在用戶搜索的日期。

該活動還必須獲得批准才能在搜索結果中顯示。

問題是如果用戶只填寫一個字段,表單不起作用。

以前的開發人員編寫了這些代碼,我負責完成它的工作。

通常我會將AND flyers.location...更改爲OR flyers.location,但這意味着它會返回您指定的日期或位置的結果。

+0

你有一些規定說你必須要做到這一點它的一部分在SQL查詢中?如果性能不是一個大問題 - 我只會建議從PHP代碼中進行日期檢查。 – Avisra 2011-05-07 21:24:19

+0

在查詢數據庫之前,在PHP中執行操作會更容易,但我不知道如何執行此操作? – Amz 2011-05-09 08:29:12

回答

1

有幾種方法可以解決這個問題,但最快的方法是在方法簽名本身中設置一個默認值。

而不是

public function search_flyers($location, $date) 

你其實可以通過設置他們像這樣(只是一個例子)添加默認值

public function search_flyers($location = 'mylocationstring', $date = strtotime("-1 week")) 

如果用戶不選擇一個日期或地點,$日期和$位置將默認爲您指定的值。

現在,更簡潔的方法是確保用戶在提交視圖前正確填寫了表單。你可以不讓用戶運行search_flyers($日期,$位置),如果表單驗證運行等於假與CodeIgniter的表單驗證http://codeigniter.com/user_guide/libraries/form_validation.html做到這一點

if ($this->form_validation->run() == FALSE) 
{ 
    //go back to your initial view 
} 
else 
    { 
      $data['results'] = search_flyers($location,$date)  
        $this->load->view('form success',$data); 
    }