在搜索有关此主题的许多资源/答案之后,我决定编写自己的代码。基于这里的@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”上进行),并且如果没有排序,则默认情况下将按“日期然后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。和“&”
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
。但是您需要通过composerpecl install pecl_http
或安装jakeasmith / http_build_url。