PHP에서 query_string을 관리하는 가장 좋은 방법은 무엇입니까?
-
03-07-2019 - |
문제
내 사이트 중 하나는 페이지 매김 위에 매우 복잡한 정렬 기능을 가지고 있으며 다양한 변수는 매우 복잡한 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, '&'); // 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;