2009-11-06 4 views
0

오름차순 및 내림차순으로 다른 필드별로 데이터를 정렬하려고합니다.ORDER BY 필드 이름 만 다른 mysql 문 축소.

입력을 기반으로
$stmt1 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 DESC"); 
$stmt2 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field1 ASC"); 
$stmt3 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field2 DESC"); 
$stmt4 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC"); 
$stmt5 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 DESC"); 
$stmt6 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field3 ASC"); 
$stmt7 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 DESC"); 
$stmt8 = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY field4 ASC"); 

, 나는 오른쪽 문 및 바인딩을 선택하고 실행 :하지만 내가 가지고있는 4 개 분야에 대해 서로 다른 MySQL의 PDO 문 (8 개 쿼리가 총)을 가지고있다.

if ($sortcode == 1){ 
    $stmt1->bindParam(':categ', $categ, PDO::PARAM_STR); 
    $stmt1->execute(); 
    $fetched = $stmt1->fetchAll(PDO::FETCH_ASSOC); 
} else if ($sortcode == 2){ 
    $stmt2->bindParam(':categ', $categ, PDO::PARAM_STR); 
    $stmt2->execute(); 
    $fetched = $stmt2->fetchAll(PDO::FETCH_ASSOC); 
} else if ($sortcode == 3){ 
    $stmt3->bindParam(':categ', $categ, PDO::PARAM_STR); 
    $stmt3->execute(); 
    $fetched = $stmt3->fetchAll(PDO::FETCH_ASSOC); 
} 
//repeat the block 5 more times, for a total of 8 

이것은 전혀 표시되지 않습니다. select 문은 필드와 desc/asc의 이름 만 다르므로 $sortcode을 얻고 다음에 오는 코드를 압축하는 더 좋은 방법이 있습니까?

내가 더 구체적으로 질문을 할 수있을 것 같아요 : 필드 이름과 오름차순/동적으로 decs 바인딩하는 단일 문/단일 pdo 문을 수있는 방법이 있습니까?

답변

4

준비된 명령문을 보유하기 위해 연관 배열을 사용하십시오.

입력 내용은 열과 정렬 방법입니다. 맞습니까? 이렇게하여 쿼리를 준비 : 올바른 쿼리를 찾기 위해, 이제

$columns = array("field1", "field2", "field3", "field4"); 
$orders = array("asc", "desc"); 
$queries = array(); 
foreach($columns as $col) { 
    $queries[$column] = array(); 
    foreach ($orders as $order) { 
    $queries[$column][$order] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order"); 
    } 
} 

, 일부 합성 코드가 필요하지 않습니다 - 당신은 그냥 직접 열 및 순서를 찾아보십시오.

사용자가 1-8의 숫자를 입력하는 대신 쿼리를 조회하려면 열과 주문을 입력하게하십시오. 열이 변수 $ col에 있고 순서가 $ ord에 있다고 상상해보십시오. 그냥 $ queries [$ col] [$ ord]라고 말하면됩니다.

숫자를 사용해야하는 이유 (이유는?)가 약간 다른 전략이 필요합니다. 이 경우 이라는 숫자를까지 저장합니다.

$columns = array("field1", "field2", "field3", "field4"); 
$orders = array("asc", "desc"); 
$queries = array(); 
$i = 0; 
foreach($columns as $col) { 
    foreach ($orders as $order) { 
    $i = $i + 1; 
    $queries[$i] = $po->prepare("SELECT * FROM tabname WHERE categ=:categ ORDER BY $column $order"); 
    } 
} 

즉, 검색하려는 방법에 따라 검색어를 저장해야합니다.

+0

+1 정렬 열과 열 번호를 쉽게 추가 할 수 있습니다. - yikes – Fedearne

+0

이것은 좋은 생각입니다. ** 그러나 여전히 8 개의 다른 pdo 문이있는 큰 문제는 해결되지 않습니다. 그래서 각 옵션에 대해, 바인딩 시간에 관해서는, 나는 여전히 그 고유 명칭의 쿼리를 호출하고 바인드하여 실행해야합니다. 그래서 주 코드 (내가 가지고있는 8 블록)는 여전히 같고 줄어들지 않습니다. +1하지만 노력하고 있습니다. 정확히 내가 묻는 것은 아닙니다. – Chris

+0

답장을 편집하여 문제가 실제로 어떻게 해결되는지 더 자세히 설명합니다. – novalis

1

매개 변수화 할 수있는 열 번호로 정렬 할 수 있습니다. SELECT 절에서 열을 지정하면 ORDER BY를이 방식으로 사용하는 것이 보통 더 명확합니다. 비록 ASC/DESC가 매개 변수화 될 수 있는지 확실하지 않습니다 ...

+0

열 이름 또는 열 번호 만 사용할 수도 있습니까? – Chris

0

항상 동적으로 쿼리를 작성할 수 있습니다. $sortcode 사이에지도를 저장하고 검색어의 일부인 SELECT * FROM tabname WHERE categ=:categ을 입력하고 $sortcode을 기반으로 오른쪽 열 이름을 가져오고 ORDER BY ... 부분을 추가합니다.

+0

pdo의 보안 기능을 희석 할 것을 제안하는 것처럼 문자열 연결을 통해 쿼리의 일부분을 구성하고 있습니까? 'categ'는 사용자 제공 데이터이고, 나머지는 내 것이기 때문에 아닙니다. 제 추측은 아니지만 이중 점검 만하고 싶습니다. – Chris

+0

쿼리에 추가하는 것은 코드이며 사용자 입력이 아닙니다. –