Frage

Einer meiner Websites hat einige sehr komplizierte Sortierfunktionen auf einem Paginierung und die verschiedenen Variablen hinzufügen zu einer ziemlich komplexen URL auf, was ein großer Schmerz zu verwalten. Gibt es eine Möglichkeit, die QUERY_STRING effizient zu verwalten?

Damit meine ich ... wenn die URL index.php? Catid = 3 & sort = Datum & year = 2009 & page = 2, und ich wünsche den Benutzer Sprung auf Seite 3 haben, oder die Sortiermethode ändern ..... wie würde ich die restlichen vars ohne Prüfung für jeden einzelnen var mit einem if / else Zustand und echo sie aus in der Verbindung erhalten, die auf Seite 3 oder alternative Sortiermethode verbinden würde.

War es hilfreich?

Lösung

Um eigentliche Abfrage Strings (String-Format) zu verarbeiten, können Sie parse_str() . Wenn Sie eine Abfrage-String bauen möchten, verwenden Sie http_build_query() .

Es gibt nicht wenige Beispiele auf den entsprechenden Seiten der Dokumentation.

Wenn Sie aus irgendeinem Grund nicht http_build_query Besuche meine Frage über die schnellster Weg, ein assoziatives Array implodieren.

<?php
$QueryString = 'catid=3&sort=date&year=2009&page=2'; // sample querystring
parse_str($QueryString, $HttpQuery);

print_r($HttpQuery); // will be an associative array

$HttpQuery['page'] = 3; // change any values

$NewQueryString = http_build_query($HttpQuery); // rebuild the querystring

Andere Tipps

PHP liefert Ihnen eine globale $ _GET, die alle Ihre Query-String hält gut in Elemente analysiert

$_GET['catid'] will be '3'
$_GET['sort'] will be 'date'
$_GET['year'] will be '2009'

etc

Sie könnten diejenigen unset Sie nicht wollen, zusammen führen und dann auf neue URL über etwas bewegen wie:

$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);

Wenn Sie meinen, dass Sie möchten, dass der Link auf Seite 3 wäre nur

index.php?page=3

oder einen Link, um die Sortiermethode zu ändern wäre nur

index.php?sort=date

Sie müßten die anderen Variablen speichern, in Session-Variablen (oder Cookies, wenn Sie sie wollen nicht länger bestehen bleiben).

So etwas wie folgt aus:

<?php

  session_start();

  foreach($_GET as $var => $val) {
    // filter any malicious stuff and invalid variables out of $var and $val here
    // like
    if (in_array($var, $array_of_valid_variable_names)) {
      if ($var == 'page') $val = intval($val);

      $_SESSION[$var] = $val;
    }
  }

  // do stuff based on the values stored in $_SESSION

  echo '<a href="index.php?page='.($_SESSION['page'] + 1).'">Next page</a>';
?>

Fügen Sie die Variablennamen und Wert am Ende der Abfrage-String (Seite 3 Ändern):

index.php?catid=3&sort=date&year=2009&page=2&x=page&y=3

Dann, nachdem gesetzt $ _GET, verwenden Sie eine einfache Funktion zu überprüfen, ob x und y zu extrahieren.

Wenn sie sind, setzen Sie die Variable, deren Name in x auf den Wert y enthalten ist.

Sie können den gleichen Link überall mit einem einfachen Zusatz am Ende verwenden, und die Menge der Programmierung ist minimal.

Sie die Zeichenfolge nicht direkt verwalten, sondern ein Array (Schlüssel => Wert) Darstellung davon verwalten und es nur zu bespannen übersetzen zurück, wenn nötig.

Eine Möglichkeit, es zu tun:

function explodeQueryString( $queryString )
{
    $parts = array();
    if ( strlen( $queryString ) > 1 && substr( $queryString, 0, 1 ) == '?' )
    {
        $q = explode( '&', substr( $queryString, 1 ) );
        foreach( $q as $part )
        {
            list( $key, $value ) = explode( '=', $part );
            $parts[ urldecode( $key ) ] = urldecode( $value );
        }
    }
    return $parts;
}

function implodeQueryString( array $arguments )
{
    $parts = array();
    foreach( $arguments as $key => $value )
    {
        $parts[ ] = sprintf( '%s=%s', urlencode( $key ), urlencode( $value ) );
    }
    return sprintf( '?%s', implode( '&', $parts ) );
}

// $query = $_GET;

$query = '?something=1&somethingelse=2&page=1&yetsomethingelse=3';

$q = explodeQueryString( $query );

print_r( $q );

$q[ 'page' ] += 1;

$query = implodeQueryString( $q );

echo $query;
scroll top