2009-12-15 3 views
0

사용자를위한 "고급"검색 필드를 만들려고합니다. (사용자가 검색 목록을 짧게하는 5-8 필드가 있습니다.)Sql 쿼리 - if 문

게시 된 필드가 비어 있지 않은지에 따라 쿼리를 작성해야한다고 생각합니다.

이 내 원래의 질의이지만,이에, 나는 테이블의 모든 행을 가지고는 ..

$query = "select * from MYTABLE where FIELD1 LIKE '%$sample1%' OR FIELD2 LIKE '%$sample2%' OR FIELD3 LIKE '%$sample3%' OR FIELD4 LIKE '%$sample4%' order by name"; 

그래서 내가 쿼리 문 경우에 사용하는 것 같아요,하지만 난 잘 모릅니다, 내가 가지고 항상 오류. 한 가지 더 : 사용자가 "sample4"를 채우는 경우 "sample1"을 채워야합니다. 어떻게 확인할 수 있습니까?

도움 주셔서 감사합니다.

+12

구글하십시오 "SQL 인젝션 공격 '그것은 그가 SQL 주입을 알고 있는지 아니에요 아니에요 –

+0

,하지만 당신이 옳다고 생각합니다. Mitch – Scoregraphic

+0

어떤 RDBMS를 코딩하고 있습니까? – Adrian

답변

0

아마도 모두 포함하는 대신 사용자가 채운 필터 제약 조건 만 포함하는 쿼리를 만드는 것이 더 나을 것입니다.

당신이 당신의 해결 방법을 수행하려는 경우, 당신은 SQL이

CASE WHEN 

MySQL을

에 대한 MS SQL에 대한 thisthis를 참조하십시오 건설 사용할 수 있습니다
+0

이것은 내가 원하는 것입니다. "필터 만 포함하는 쿼리를 다시 작성하십시오 ..." 하지만 어떻게 알지 못합니다. – Holian

2

또한이 작업을 수행 할 배열을 사용할 수 있습니다, 그것은 것 이런 방식으로 더 조직화되어야한다. 모든 where 조건에 대해 하나의 배열 항목에 저장하고 마지막으로 SQL을 생성 할 때 이들을 조인합니다.

<? 

$fields = array('field1', 'field2', 'field3'); 
// Changed this to 0, so it won't return all rows 
// but also the default array element prevent the statement to fail when 
// no search is being specified at all 
$wheres = array(0); 
foreach ($fields as $fieldname) { 
    // Get user input 
    $search = $_GET[$fieldname]; 
    // add condition to wheres if not empty 
    if (!empty($search)) { 
    $wheres[] = $fieldname . ' LIKE "%' . mysql_real_escape_string($search) . '%"'; 
    } 
} 

// Join the wheres conditions using OR, (or AND) 
$query = 'select * from MYTABLE where' . join(' OR ', $wheres); 

?> 
+1

그러나 위에서 언급 한 것처럼 SQL 인젝션을 처리하십시오. – Zeemee

+0

나는 이것을 좋아하지만 뭔가 잘못되었습니다. 나는 이걸로 테이블에서 모든 행을 가지고 ... – Holian

+0

미안하지만, 내 잘못은 OR 비교 문에 기본 1 넣어. 0으로 변경하면됩니다. – Darkerstar

0

이 같은 "아니다 널 (null)"연산자를 사용하여 시도 할 수 있습니다 :

select * 
from mytable 
where 
(field1 is not null and field1 like '%test%') or 
(field2 is not null and field2 like '%test%') or 
(field3 is not null and field3 like '%test%') or 
(field4 is not null and field4 like '%test%') 
order by name 

참조 또한 Handling MySQL NULL Values