문제

내 사이트 중 하나는 페이지 매김 위에 매우 복잡한 정렬 기능을 가지고 있으며 다양한 변수는 매우 복잡한 URL에 추가되며 관리하기가 큰 고통입니다. query_string을 효율적으로 관리하는 방법이 있습니까?

이 의미는 ... URL이 index.php? catid = 3 & sort = date = 2009 & page = 2 인 경우, 사용자가 3 페이지로 점프하거나 정렬 방법을 변경하고 싶습니다 ..... 어떻게 보존 할 것인가? if/else 조건이있는 각 개별 VAR을 확인하지 않고 나머지 VAR은 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

다른 팁

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);

3 페이지에 대한 링크가

index.php?page=3

또는 정렬 방법 변경에 대한 링크는

index.php?sort=date

다른 변수를 저장해야합니다 세션 변수 (또는 쿠키가 더 오래 지속되기를 원한다면).

이 같은:

<?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>';
?>

여기에 제공된 대부분의 솔루션이 작동하지만 가장 간단한 방법은

// 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() 그리고 parse_str() (그것은 이름이 완전히 엉망인 기능 중 하나입니다. 아무도 그 기능이 이름을 보면서하는 일을 할 것을 기대하지 않을 것입니다).

나는 일반적인 "정렬 가능하고 pagable 테이블을 만들기"클래스와 똑같은 문제를 겪었습니다. 그렇기 때문에 누군가가 PHP에서 "기능"이라는 하위 프로세스를 발명 한 이유입니다.

링크 건설 프로세스를 정확히 처리하는 함수를 만들어야합니다. 그렇게 :

/**
* $set: associative array of changing vars
* $unset : normal array of vars to delete
**/
function get_link($set,$unset=array())
{
 $set+=$_GET;
 if ($unset && is_array($unset))
   foreach($unset as $idx) 
      unset($set[$idx]);

 if ($set)
   foreach($set as $name=>$value)
      $pairs[]=$name.'='.urlencode($value);

 return $_SERVER['SCRIPT_NAME']."?".join('&',$pairs);
}

테스트되지 않은 코드! 뇌를 사용하십시오

또는 페이지 링 및 정렬에 $ _session-vars를 사용할 수 있으며 ( '물건) 링크 만 변경할 수 있습니다.

쿼리 문자열 끝에서 변수 이름과 값을 추가합니다 (페이지 변경) :

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

그런 다음 $ _get을 추출한 후 간단한 기능을 사용하여 x와 y가 설정되어 있는지 확인하십시오.

그렇다면 이름이 x에 포함 된 변수를 값 y로 설정하십시오.

마지막에 간단한 추가로 동일한 링크를 사용할 수 있으며 프로그래밍의 양은 최소화됩니다.

문자열을 직접 관리하지 말고 배열 (key => value) 표현을 관리하고 필요할 때만 문자열로 다시 번역하십시오.

가능한 한 가지 가능한 방법 :

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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top