2009-06-08 6 views
1

매개 변수가PHP/MySQL에서 쿼리 문자열을 사용하여 결과 집합을 필터링하는 방법은 무엇입니까?

내 질문은 쿼리 문자열 전달과 나는 등 날짜, 카테고리별로 이벤트를 필터링 할 수 있습니다 last.fm/events

사용자와 유사한 이벤트 페이지를 짓고 있어요는, 구조하는 가장 좋은 방법은 무엇 당신의 코드 (검색어, 루프)를 사용하여 서로 다른 검색어 유형을 허용하고 결합 할 수 있습니다 (예 : 카테고리로 필터링).

이 유형의 페이지를 만드는 방법에 대한 실질적인 예/참고 자료를 찾고 있습니다. 쿼리 문자열을 사용하여 필터링 할 수있는 결과 집합).

답변

4

사용자 지정 데이터베이스 쿼리를 구축하기위한 일반적인 패턴 : PDO를

$sql = 'SELECT * FROM foo '; 
$sql .= 'WHERE 1 '; 

if (array_key_exists('category', $_GET)) { 
    $sql .= sprintf('AND category_id = %d ', intval($_GET["category"])); 
} 

if (array_key_exists('date', $_GET)) { 
    $sql .= sprintf('AND date = "%s" ', mysql_real_escape_string($_GET["date"])); 
} 

// and so on... 

을 또는 사용 : 데이터베이스 결과 추가 필터링을 할 필요가, 그냥 복사 루프를 사용

$params = array(); 

$sql = 'SELECT * FROM foo '; 
$sql .= 'WHERE 1 '; 

if (array_key_exists('category', $_GET)) { 
    $sql .= 'AND category_id = ? '; 
    $params[] = $_GET["category"]; 
} 

if (array_key_exists('date', $_GET)) { 
    $sql .= 'AND date = ? '; 
    $params[] = $_GET["date"]; 
} 

// and so on... 

$stmt = $db->prepare($sql); 
$stmt->execute($params); 

결과를 생략해야하는 행이있을 때마다 데이터를 대상 배열에 그리고 continue에 저장합니다.

0

우선 쿼리 문자열의 데이터를 사용하여 쿼리를 실행하는 경우 보안을 위해 준비된 문/저장 프로 시저를 사용하는 것이 좋습니다. 또한 MySQL 5.1.17 쿼리 캐싱은 준비된 문과 함께 작동합니다.

준비된 명령문은 PHP의 일반적인 쿼리와 마찬가지로 구축 할 수 있으며 특정 쿼리에 필요한 다양한 쿼리 부분을 연결합니다.

if(use_date) $sql_where[] = "date = ?"; 
if(use_category) $sql_where[] = "category = ?"; 
$sql = $sql . implode(" AND ", $sql_where); 

의 절차를 반복 (또는 같은에서 그 일을 : 당신이 그들을 내파 후 사용하는 것들의 배열에 각각 문을 할당 할 수 inbetween 배치 'AND의 필요와 불만을 피하기 위해

시간)을 선택하여 쿼리에 필요한 데이터 필드도 삽입합니다.

관련 문제