2013-06-15 12 views
6

Ich habe eine Seite, die Elemente nach zahlreichen Parametern auflistet, dh Variablen mit Werten.php; entferne ein einzelnes Variablenwertpaar von querystring

listitems.php?color=green&size=small&cat=pants&pagenum=1 etc. 

Zur Bearbeitung der Liste zu aktivieren, habe ich einen Parameter bearbeitet = 1, die auf den oben Abfragezeichenfolgeflag angefügt zu geben:

listitems.php?color=green&size=small&cat=pants&pagenum=1&edit=1 

So gut, so weit.

Wenn der Benutzer die Bearbeitung beendet hat, habe ich einen Link, der den Bearbeitungsmodus verlässt. Ich möchte, dass dieser Link den gesamten Querystring angibt - was auch immer er sein mag, da dies den Benutzereinstellungen unterliegt - außer entferne den Edit = 1.

Wenn ich nur ein paar Variablen hatte, habe ich sie nur manuell in den Link aufgelistet, aber jetzt, da es mehr gibt, möchte ich in der Lage sein, programmatisch nur die Bearbeitung zu entfernen = 1.

Sollte ich eine Suche nach edit = 1 durchführen und dann einfach durch nichts ersetzen?

$qs = str_replace("&edit=1, "", $_SERVER['QUERY_STRING']); 
<a href='{$_SERVER['PHP_SELF']}?{$qs}'>return</a>; 

Oder was wäre die sauberste meisten fehlerfreie Art und Weise, dies zu tun.

Hinweis: Ich habe eine ähnliche Situation, wenn ich von Seite zu Seite gehe, wo ich das Pagenum herausnehmen und durch ein anderes ersetzen möchte. Da die Seitennummer variiert, kann ich nicht einfach nach pagenum = 1 suchen, sondern müsste nach pagenum =$pagenum suchen, wenn das einen Unterschied macht.

Danke.

Antwort

16

ich http_build_query verwenden würde, die gut eine Reihe von Parametern und formatiert sie richtig akzeptiert. Sie könnten den Bearbeitungsparameter von $_GET aufheben und den Rest in diese Funktion schieben.

Beachten Sie, dass Ihr Code einen fehlenden Anruf an htmlspecialchars() hat. Eine URL kann Zeichen enthalten, die in HTML aktiv sind. Also beim Ausgeben in einen Link: Escape!

Einige Beispiele:

unset($_GET['edit']); // delete edit parameter; 
$_GET['pagenum'] = 5; // change page number 
$qs = http_build_query($_GET); 

... output link here. 
+0

Wie würde ich das tun von $ _SERVER [ 'QUERY_STRING']? – user1904273

+0

Es gibt 'parse_url()' und 'parse_str()', aber $ _GET ist immer verfügbar und gefüllt, also ist dies nicht notwendig. – Sven

+1

Ich würde nicht die $ _GET-Variable (oder irgendwelche Superglobals für diese Angelegenheit) ändern, weil sie an anderer Stelle in der Anwendung benötigt werden könnten. Erstellen Sie stattdessen eine temporäre Variable wie '$ edit_query = $ _GET;'. Dann kannst du '$ edset ($ edit_query ['edit']))' 'setzen, ohne deine Superglobals zu beeinflussen. – Number1SuperGuy

0

Es würde nicht funktionieren, wenn edit=1 die erste Variable ist:

listitems.php?edit=1&color=green&... 

Sie können die $_GET Variable verwenden, um sich die Query-String zu erstellen. Etwas wie:

$qs = ''; 
foreach ($_GET as $key => $value){ 
    if ($key == 'pagenum'){ 
     // Replace page number 
     $qs .= $key . '=' . $new_page_num . '&'; 
    }elseif ($key != 'edit'){ 
     // Keep all key/values, except 'edit' 
     $qs .= $key . '=' . urlencode($value) . '&'; 
    } 
} 
2

Eine andere Lösung, zu &amp; Probleme zu vermeiden !!!

remove_query('http://example.com/?a=valueWith**&amp;**inside&b=value'); 

Code:

function remove_query($url, $which_argument=false){ 
    return preg_replace('/'. ($which_argument ? '(\&|)'.$which_argument.'(\=(.*?)((?=&(?!amp\;))|$)|(.*?)\b)' : '(\?.*)').'/i' , '', $url); 
} 
Verwandte Themen