Nachdem ich nach vielen Ressourcen / Antworten zu diesem Thema gesucht hatte, entschied ich mich, meine eigenen zu codieren. Basierend auf der Antwort von @ TaylorOtwell hier verarbeite ich auf diese Weise eingehende $ _GET-Anforderungen und ändere / manipuliere jedes Element.
Angenommen, die URL lautet: http://domain.com/category/page.php?a=b&x=y
Und ich möchte nur einen Parameter zum Sortieren: entweder? Desc = Spaltenname oder? Asc = Spaltenname. Auf diese Weise reicht ein einziger URL-Parameter aus, um gleichzeitig zu sortieren und zu bestellen. Die URL lautet also http://domain.com/category/page.php?a=b&x=y&desc=column_name, wenn Sie zum ersten Mal auf die zugehörige Tabellenkopfzeile klicken.
Dann habe ich Tabellenzeilenüberschriften, die ich beim ersten Klick nach DESC und beim zweiten Klick nach ASC sortieren möchte. (Jeder erste Klick sollte zuerst "ORDER BY column DESC" sein.) Wenn keine Sortierung erfolgt, wird standardmäßig nach "date then id" sortiert.
Sie können es weiter verbessern, indem Sie jeder $ _GET-Komponente Reinigungs- / Filterfunktionen hinzufügen, aber die folgende Struktur legt den Grundstein.
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, '&');}
(Sie können $ _SERVER [SCRIPT_URI] für eine vollständige URL verwenden, die mit http://domain.com beginnt. )
Dann verwende ich den resultierenden $ ORDER, den ich oben in der MySQL-Abfrage erhalte:
"SELECT * FROM table WHERE limiter = 'any' $ORDER";
Nun die Funktion, die URL zu überprüfen, wenn es eine vorherige Sortierung gibt, und der URL einen Sortier- (und Ordnungs-) Parameter mit "?" oder "&" entsprechend der Reihenfolge:
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";
}
}
}
Schließlich der Tabellenzeilenkopf, um die Funktion zu verwenden:
echo "<th><a href='".sort_order('id')."'>ID</a></th>";
Zusammenfassung: Hiermit wird die URL gelesen, jede der $ _GET-Komponenten geändert und die endgültige URL mit Parametern Ihrer Wahl mit der korrekten Verwendungsform von "?" und "&"
echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);
. Sie benötigenpecl install pecl_http
oder installieren jakeasmith / http_build_url über Composer.