2013-06-15 10 views
6

Mam stronę, która zawiera listę pozycji według wielu parametrów, tj. zmiennych z wartościami.php; usuń pojedynczą parę wartości zmiennej z querystringa

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

Aby włączyć możliwość edycji listy, mam zmienił parametr = 1, który jest dołączany do powyższej kwerendy dać:

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

tej pory tak dobrze.

Po zakończeniu edycji użytkownik ma łącze, które wychodzi z trybu edycji. Chcę, aby ten link określał cały ciąg znaków zapytania - niezależnie od tego, jaki jest, zależnie od wyboru użytkownika - poza usunięciem edycji = 1.

Kiedy miałem tylko kilka zmiennych, po prostu wylistowałem je ręcznie w łączu, ale teraz, gdy jest ich więcej, chciałbym programowo móc usunąć edycję = 1.

Czy powinienem wykonać jakieś wyszukiwanie dla edycji = 1, a następnie zastąpić ją niczym?

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

Albo jaki byłby najczystszy bezbłędnie sposób na zrobienie tego.

Uwaga: Mam podobną sytuację, gdy przechodzę od strony do strony, gdzie chciałbym wyjąć pagenum i zastąpić go innym. Tam, ponieważ pagenum jest zmienne, nie mogę po prostu wyszukać pagenum = 1, ale musiałbym szukać pagenum =$pagenum, jeśli to robi jakąkolwiek różnicę.

Dzięki.

Odpowiedz

16

użyję http_build_query, który ładnie akceptuje tablicę parametrów i formatów go prawidłowo. Będziesz mógł anulować ustawienie parametru edycji z $_GET i wepchnąć resztę do tej funkcji.

Pamiętaj, że Twój kod zawiera brakujące połączenie z numerem htmlspecialchars(). Adres URL może zawierać znaki, które są aktywne w HTML. Więc kiedy wyświetla się w łączu: Escape!

Kilka przykładów:

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

... output link here. 
+0

Jak zrobić to z $ _SERVER [ 'QUERY_STRING']? – user1904273

+0

Istnieje 'parse_url()' i 'parse_str()', ale $ _GET jest zawsze dostępny i wypełniony, więc nie jest to konieczne. – Sven

+1

Nie zmodyfiowałbym zmiennej $ _GET (ani żadnych superglobałów), ponieważ mogłyby być potrzebne w innym miejscu aplikacji. Zamiast tego utwórz tymczasową zmienną, taką jak '$ edit_query = $ _GET;'. Następnie możesz 'unset ($ edit_query ['edit']);' bez wpływu na twoje superglobale. – Number1SuperGuy

0

To nie będzie działać, jeśli edit=1 to pierwsza zmienna:

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

Można użyć zmiennej $_GET stworzyć ciąg kwerendy samodzielnie. Coś jak:

$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

Innym rozwiązaniem, aby uniknąć problemów &amp; zbyt !!!

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

Kod:

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