2009-08-07 5 views
3

이렇게 간단한 작업처럼 보이지만, 제가 좋아하는 솔루션을 찾는 데 어려움을 겪고 있습니다. 내가 clunky 이외의 것을 고려할만한 것을 찾을 수는 없다. 여기 내가 함께 일하고있어 :게시 된 변수를 기반으로 MySQL 쿼리를 작성하십시오.

처리 스크립트에 변수를 게시하는 검색 양식이 있습니다. 이러한 변수는 쿼리되는 데이터의 필터입니다. 사용자의 권한에 따라 액세스 권한이있는 필터에 따라 유입되는 변수가 더 많거나 적을 수 있습니다. 각 필터는 기본적으로 결과가 나오는 표의 필드를 참조합니다. 각 필터에 대한 하나의 옵션은 "ANY"이므로 WHERE 절도 필요하지 않습니다.

쿼리 문자열을 작성하는 좋은 방법은 무엇입니까? $ firstname, $ lastname, $ age, $ dob 등 네 가지 변수가 있다고 가정 해 보겠습니다. 그러나 일부 사용자 만 $ age 및 $ dob로 필터링 할 수 있습니다.

$query = "SELECT * FROM people"; 
if(($firstname != 'ANY' && !empty($firstname)) || 
    ($lastname != 'ANY' && !empty($lastname)) || 
    ($age != 'ANY' && !empty($age)) || 
    ($dob != 'ANY' && !empty($dob))) { 
    $query .= " WHERE"; 
} 

if($firstname != 'ANY' && !empty($firstname)) { 
    $query .= " firstname='$firstname'"; 
} 
if($lastname != 'ANY' && !empty($lastname)) { 
    if($firstname != 'ANY' || !empty($firstname)) { 
     $query .= " AND"; 
    } 
    $query .= " lastname='$lastname'"; 
} 
... 

등등. 그러나 그것은 단지 나에게 멍청하고, 끔찍하며, 비 효과적으로 보입니다. 약간 수정 된 MVC 패턴을 사용하고 있으므로 가능한 각 필터에 대해 검색 모델에 메서드를 구축하는 것이 합리적일까요?

+0

수행 할 수 있지만 공간을 줄이기위한 보조 메모로 *를 사용하지 말고 입력란을 지정하십시오. –

답변

5

나는이 가고 싶어 : 당신은 교대로 배열에 모든 문을 수집 할 수

 
$query = "SELECT * FROM people"; 

$whereClause = " WHERE 1 = 1 "; 
if($firstname != 'ANY' && !empty($firstname)) { 
    $whereClause .= " AND firstname='$firstname' "; 
} 
if($lastname != 'ANY' && !empty($lastname)) { 
    $whereClause .= " AND lastname='$lastname' "; 
} 

$query .= $whereClause; 

그냥 이동 :

 
if (count($arr)>0) { 
    $query = "$query 
       WHERE ". implode(" AND ",$arr); 
} 
+0

그런 접근 방식을 절대로 생각하지 마십시오. 나는 패턴이나 내가 할 수있는 어떤 종류의 것 같은 느낌이 든다. 그러나 적어도 지금은 코드를 정리할 것이다. –

+0

더 깨끗한 접근 방식입니다. 사실 나는 네이선의 오프너와이 대답 모두에서 내 코드를 향상시킬 수있다. Nathan의 질문에 대한 일반적인 대답은 "네, PHP는 다소 복잡하게 보일 수 있습니다. 미안 해요. 나는 계속 조정할 것입니다. 아마도 내가 틀렸을 것입니다. (그리고 아마도 다른 게시 된 답변에 대해 PDO를 조사해야합니다.) – Smandoli

+0

여러 변수를 다룰 때 그 값에 따라 최종 결과가 변경됩니다. 무엇이든지 상관없이 뒤죽박죽이 될 것입니다. 차이점은 읽기가 더 쉽지 않고 읽기 쉽도록 만드는 것입니다. 나는 여전히 그걸 가지고 놀고있다. 나는 아직도 실종 된 것처럼 느낀다. –

0
+0

불행히도 저는 현재 PDO를 사용하지 않고 있습니다. 그것이 분명히 내가 찾고있는 것입니다. 나는이 코드의 일부를 물려 받았고 나는 한 번에 너무 많이 바꿀 수있다. –

+0

사용자는 다음 주소로 리디렉션됩니다. http://github.com/indeyets/MySQL-Query-Builder/tree/master – Smandoli

0

여기 게시 된 모든 변수를 가져 와서 문자열을 toge하는 코드가 있습니다. 그.

foreach($_POST as $name=>$value){ 
    $arrFields[] = $name." = '".$value."'"; 
} 
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields); 

또는는 필드 이름은 테이블 이름과 동일하지 않은 경우, 또는 당신은 당신의 SQL 다르게 필드를 처리하려는 경우, 당신은 스위치를 사용할 수 있습니다.

foreach($_POST as $name=>$value){ 
    switch($name){ 
     case "firstname": 
      $arrFields[] = "fName = '".$value."'"; 
      break; 
     case "lastname": 
      $arrFields[] = "lName = '".$value."'"; 
      break; 
     case "age": 
      $arrFields[] = "bioAge >= ".$value; 
      break; 
    } 
} 
$sSql = "SELECT * FROM people WHERE 1 AND ".implode(" AND ",$arrFields); 
관련 문제