在搜索了有关此主题的许多资源/答案后,我决定自己编写代码。根据@TaylorOtwell 在此处的回答,这就是我处理传入 $_GET 请求并修改/操作每个元素的方式。
假设网址为: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, '&');}
(您可以使用 $_SERVER[SCRIPT_URI] 获取以http://domain.com 开头的完整 URL)
然后我在 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和“&”