4

私のサイトの 1 つには、ページネーションに加えて、いくつかの非常に複雑な並べ替え機能があり、さまざまな変数の合計が非常に複雑な URL になり、管理が非常に困難です。QUERY_STRING を効率的に管理する方法はありますか?

つまり... URL が index.php?catid=3&sort=date&year=2009&page=2 で、ユーザーに 3 ページにジャンプしてもらいたい場合、または並べ替え方法を変更したい場合...どうすれば保存できますか? if/else 条件を使用して個々の変数をチェックせずに残りの変数を検索し、ページ 3 または別の並べ替え方法にリンクするリンクでそれらをエコーアウトします。

4

7 に答える 7

3

PHP はグローバルな $_GET を提供します。これは、クエリ文字列を要素に適切に解析して保持します。

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

渡したくないものを設定解除してから、次のような方法で新しい URL に移動できます。

$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);
于 2009-03-04T06:26:08.563 に答える
3

実際のクエリ文字列(文字列形式) を処理するには、 を使用できますparse_str()。クエリ文字列を作成する場合は、 を使用しますhttp_build_query()

これらのドキュメント ページにはかなりの数の例があります。

何らかの理由で を使用できない場合は、連想配列を内破する最速の方法http_build_queryに関する私の質問を確認してください。

<?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
于 2009-03-04T07:28:58.083 に答える
1

あなたがそれを望むなら、3ページへのリンクはただであるでしょう

index.php?page=3

または、並べ替え方法を変更するためのリンクは

index.php?sort=date

他の変数をセッション変数(または、より長く存続させたい場合はCookie)に格納する必要があります。

このようなもの:

<?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>';
?>
于 2009-03-04T06:42:04.873 に答える
1

ここで提供されるソリューションのほとんどは機能しますが、これを行う最も簡単な方法は次のとおりだと思います

// parse query string into an array
$queryData = array();
parse_str($_SERVER['QUERY_STRING'], $queryData);
/*
 * ... manipulate array $queryData
 */
// rebuild query string
$queryString = http_build_query($queryData, null, '&amp;'); // or use & if you don't need XHTML compliance

それでおしまい。http_build_query()andのドキュメントを参照してくださいparse_str()(これは、名前が完全にめちゃくちゃになっている関数の 1 つです。名前を見ただけで関数が何をするかは誰も期待しません)。

于 2009-03-04T07:35:39.270 に答える
0

クエリ文字列の末尾に変数名と値を追加します (ページを 3 に変更します)。

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

次に、$_GET を抽出した後、簡単な関数を使用して x と y が設定されているかどうかを確認します。

そうであれば、名前が x に含まれる変数を値 y に設定します。

最後に簡単な追加を行うだけでどこでも同じリンクを使用でき、プログラミングの量は最小限です。

于 2009-03-04T07:34:59.880 に答える
-1

文字列を直接管理するのではなく、文字列の配列(key => value)表現を管理し、必要な場合にのみ文字列に変換し直します。

それを行う1つの可能な方法:

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;
于 2009-03-04T06:47:09.120 に答える