이 주제에 대한 많은 리소스 / 답변을 검색 한 후 직접 코딩하기로 결정했습니다. 여기 @TaylorOtwell의 답변에 따라 들어오는 $ _GET 요청을 처리하고 각 요소를 수정 / 조작하는 방법입니다.
URL이 다음과 같다고 가정합니다. http://domain.com/category/page.php?a=b&x=y
정렬을위한 매개 변수 하나만 필요합니다 :? desc = column_name 또는? asc = column_name. 이렇게하면 단일 URL 매개 변수로 동시에 정렬하고 정렬 할 수 있습니다. 따라서 관련 테이블 헤더 행을 처음 클릭 하면 URL이 http://domain.com/category/page.php?a=b&x=y&desc=column_name이 됩니다.
그런 다음 첫 번째 클릭에서 DESC를 정렬하고 동일한 제목의 두 번째 클릭에서 ASC를 정렬하려는 테이블 행 머리글이 있습니다. (처음 클릭 할 때마다 먼저 "ORDER BY column DESC"가 필요합니다.) 정렬이 없으면 기본적으로 "date then id"별로 정렬됩니다.
각 $ _GET 구성 요소에 청소 / 필터링 기능을 추가하는 것처럼 더 개선 할 수 있지만 아래 구조가 기반을 마련합니다.
foreach ($_GET AS $KEY => $VALUE){
if ($KEY == 'desc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE DESC";
$URL_ORDER = $URL_ORDER . "&asc=$VALUE";
} elseif ($KEY == 'asc'){
$SORT = $VALUE;
$ORDER = "ORDER BY $VALUE ASC";
$URL_ORDER = $URL_ORDER . "&desc=$VALUE";
} else {
$URL_ORDER .= "&$KEY=$VALUE";
$URL .= "&$KEY=$VALUE";
}
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}
( http://domain.com으로 시작하는 전체 URL에 $ _SERVER [SCRIPT_URI]를 사용할 수 있습니다. )
그런 다음 MySQL 쿼리에서 위의 결과 $ ORDER를 사용합니다.
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
이제 이전 정렬이있는 경우 URL을보고 "?"가있는 URL에 정렬 (및 정렬) 매개 변수를 추가하는 기능입니다. 또는 순서에 따라 "&":
function sort_order ($_SORT){
global $SORT, $URL_ORDER, $URL;
if ($SORT == $_SORT){
return $URL_ORDER;
} else {
if (strpos($URL, '?') !== false){
return "$URL&desc=$_SORT";
} else {
return "$URL?desc=$_SORT";
}
}
}
마지막으로 함수를 사용하는 테이블 행 헤더 :
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
요약 : URL을 읽고 각 $ _GET 구성 요소를 수정하고 올바른 형식의 "?"를 사용하여 선택한 매개 변수로 최종 URL을 만듭니다. 및 "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);. 그러나 composer 를 통해 jakeasmith / http_build_url 이 필요pecl install pecl_http하거나 설치 됩니다.