2013-06-15 3 views
6

많은 변수 즉 값이있는 변수에 따라 항목을 나열하는 페이지가 있습니다. 지금까지 너무 좋아php; querystring에서 단일 변수 값 쌍을 제거합니다.

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

:

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

목록을 편집 할 수 있도록하기 위해, 나는 줄 위의 쿼리 문자열에 추가되는 매개 변수 편집 = 1이있다.

사용자가 편집을 마쳤을 때 편집 모드를 종료하는 링크가 있습니다. 이 링크는 전체 쿼리 문자열을 지정하기를 원합니다 - 사용자 선택에 따라 달라질 수 있습니다 - 편집 제외 = 1 제외.

변수가 몇 개 밖에 없지만 링크에 수동으로 나열했지만 지금은 더 많아서 프로그래밍 방식으로 편집 = 1을 제거하고 싶습니다.

edit = 1에 대한 검색을 수행하고 그 다음 아무 것도 대체하지 않아야합니까?

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

또는 가장 오류가없는 가장 확실한 방법은 무엇입니까?

참고 : 페이지에서 페이지로 이동하여 pagenum을 꺼내 다른 것으로 바꾸려면 비슷한 상황이 발생합니다. pagenum이 다양하기 때문에 pagenum = 1을 검색 할 수는 없지만 어떤 차이가 있는지 확인하려면 pagenum =$pagenum을 검색해야합니다.

감사합니다.

답변

16

:처럼 뭔가. $_GET에서 편집 매개 변수의 설정을 해제하고 나머지는이 함수에 넣을 수 있습니다.

코드에 htmlspecialchars() 전화가 누락되었습니다. URL은 HTML에서 활성화 된 문자를 포함 할 수 있습니다. 링크로 출력 할 때 : 탈출!

일부 예 :

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

... output link here. 
+0

가 어떻게 $ _SERVER [ 'QUERY_STRING']에서 이런 짓을 했을까? – user1904273

+0

'parse_url()'과'parse_str()'이 있지만 $ _GET은 항상 사용할 수 있고 채워져 있으므로 필요하지 않습니다. – Sven

+1

$ _GET 변수 (또는 해당 문제의 모든 슈퍼 전역 변수)는 응용 프로그램의 다른 곳에서 필요할 수 있으므로 수정하지 않을 것입니다. 대신'$ edit_query = $ _GET;'와 같은 임시 변수를 생성하십시오. 그러면 슈퍼 전역에 영향을 미치지 않고 unset ($ edit_query [ 'edit']); 할 수 있습니다. – Number1SuperGuy

0

edit=1이 첫 번째 변수 인 경우가 작동하지 않을 것입니다 :

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

당신은 쿼리 문자열 자신을 만들 수 $_GET 변수를 사용할 수 있습니다. 내가 잘 올바르게 매개 변수와 형식을의 배열을 받아 http_build_query를 사용하는 것

$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

또 다른 해결책은, 너무 &amp; 문제를 방지하기 위해!

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

코드 :

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