หลังจากค้นหาแหล่งข้อมูล / คำตอบมากมายในหัวข้อนี้ฉันตัดสินใจเขียนโค้ดของตัวเอง จากคำตอบของ @ 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 แล้ว 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, '&');}
(คุณสามารถใช้ $ _SERVER [SCRIPT_URI] สำหรับ URL แบบเต็มที่ขึ้นต้นด้วยhttp://domain.com )
จากนั้นฉันใช้ผลลัพธ์ $ ORDER ที่ฉันได้รับข้างต้นในแบบสอบถาม MySQL:
"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);
. แต่คุณจะต้องpecl install pecl_http
หรือติดตั้งjakeasmith / http_build_urlผ่านนักแต่งเพลง