2013-06-15 10 views
6

私は、多数のパラメータ、すなわち値を持つ変数に従って項目をリストするページを持っています。これまでのところは良いphp;クエリ文字列から単一の変数値のペアを削除する

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

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

は、リストの編集を可能にするために、私は与えるために、上記クエリ文字列に追加されたパラメータ編集= 1を持っています。

ユーザーが編集を完了すると、編集モードを終了するリンクがあります。このリンクではクエリーストリング全体を指定する必要があります。これは、ユーザーの選択に従うものであれば何でも構いませんが、edit = 1を削除する点が異なります。

私はいくつかの変数しか持っていなかったので、リンクに手動でリストアップしましたが、もっと多くの変数があるので、プログラムでedit = 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); 
} 
関連する問題