2011-05-07 4 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

+0

데이터베이스를 쿼리하기 전에 PHP에서이를 수행하는 것이 더 쉬울 수 있지만이 작업을 수행하는 방법을 잘 모르겠습니다. – Amz

답변

1

이 문제를 해결하는 방법에는 여러 가지가 있지만 가장 빠른 방법은 메서드 서명 자체에 기본값을 설정하는 것입니다.

대신

public function search_flyers($location, $date) 

의 사용자가 날짜 또는 위치를 선택하지 않으면 당신이 실제로 (단지 예)과 같이 설정하여

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

을 기본 값을 추가 할 수 있습니다, $ date 및 $ location은 사용자가 지정한 값을 기본값으로 사용합니다.

이제 더 깨끗한 방법은 실제로 사용자가 제출하도록하기 전에보기에서 양식을 올바르게 채웠는지 확인하는 것입니다. 당신은 양식 유효성 검사 실행이 거짓 동일한 경우 사용자 실행 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); 
    } 
관련 문제