2009-12-11 2 views
2

현재 MySQL에는 여러 필드가있는 큰 테이블이 있습니다. 현재 사용자가 Select Box를 통해 각 필드별로 필터링 할 수 있도록 시도하고 있습니다.PHP/MySQL 및 셀렉트 박스로 적절히 필터링

나는 학교, 사단 및주의 4 개의 필드가 있습니다.

PHP를 사용하여 선택 상자에서 사용자가 어떤 옵션을 선택하는지에 따라 필터링하는 방법에 대해서는 아무런 문제가 없습니다. 예를 들어

,이 3 제출하는 경우 : 내가 "모두 갖고 싶어, 그러나

$school= $_POST['school']; 
$division= $_POST['division']; 
$state = $_POST['state']; 

Query: SELECT * from table WHERE school=$school AND division=$division and state=$state 

:

<select id="school"> 
<option value="13">John Brown School</option> 
</select> 

<select id="division"> 
<option value="I">I</option> 
</select> 

<select id="state"> 
<option value="NY">New York</option> 
</select> 

내가 좋아하는, 각각의 옵션에 따라 쿼리 할 수있을 것입니다 "옵션 (선택 상자에서), 특정 필드를 필터링하지 않도록 쿼리 나 WHERE 절에 어떻게 구현합니까?

+2

SQL 삽입을 피하기 위해 준비된 문을 사용하기를 바랍니다. –

+0

저는 '질문'을 가능한 한 간단하게 유지하기 위해 간결하게했습니다. – Dodinas

답변

4

구체적으로 찾는 옵션을 만들어야합니다. 사실,이 경우에는 선택 상자에 "모두"옵션을 지정하거나 비워 두는 것이 가장 좋은 선택 인 것처럼 들립니다. 빈 선택 사항이 기본값이 될 수 있습니다. 나는 그것이로 설정했을 : 쿼리 변수를 설정할 때 이제

<option value="">-- All schools --</option> 
etc. 

, 당신은이 작업을 수행합니다.

$whereClauses = array(); 
if (! empty($_POST['school'])) $whereClauses[] = 'school='.mysql_real_escape_string($_POST['school']); 
if (! empty($_POST['division'])) $whereClauses[] ='division='.mysql_real_escape_string($_POST['division']); 
if (! empty($_POST['state'])) $whereClauses[] = 'state='.mysql_real_escape_string($_POST['state']); 

$where = ''; 
if (count($whereClauses) > 0) { 
    $where = 'WHERE '.implode(' AND ',$whereClauses); 
} 

$query = "SELECT * FROM table ".$where; 

이제 어떤 선택 옵션이 (빈 값으로 선택받을 경우, 즉 사용 모두) WHERE 절에 포함되지 않습니다.

들어오는 $ _POST 데이터도 이스케이프 처리하지 않으면 SQL 인젝션 공격에 노출 될 수 있으므로, 예를 들어 추가 한 $ _POST 값에 mysql_real_escape_string()을 실행해야합니다. 너는 이미 그것을 알고있는 것처럼 들린다.

1

SQL 삽입 등을 고려하지 않은 한 가지 기본 논리는 다음과 같습니다. Psudo-code 또는 코스.

<select id="select1"> 
    <option value="">All</option> 
    <option value="value1">Value1</option> 
    ... 
</select> 



$sql = "select ... from ... where 1 = 1 "; 

if (!empty($_POST["select_1"])) { 
    $sql .=" and field1 = select1value"; 
} 

if (!empty($_POST["select_2"])) { 
    $sql .=" and field2 = select2value"; 
} 

if (!empty($_POST["select_one"])) { 
    $sql .=" and field3 = select3value"; 
} 

// Etc. 

이 방법

, 1 = 1, 당신은 그들 중 일부 또는 전부가 존재하는지 여부에 따라/앞에 추가 '및'를 추가할지 여부에 대해 걱정할 필요가 없습니다. 기본적으로 모두 (공백 선택 값)을 선택하고 각 선택 항목의 존재 여부에 따라 필터링합니다.

물론, 약간 정리하고, 보안을 설정하고, 값을 변수에 넣는 등의 작업이 필요합니다. 그러나 이것이 기본 논리입니다.

관련 문제