Pergunta

Um dos meus sites tem algumas funções de ordenação muito complicado, no topo de uma paginação, e as diversas variáveis ??se somam a uma URL bastante complexo, que é uma enorme dor de gerir. Existe uma maneira de gerir o QUERY_STRING de forma eficiente?

Com isto quero dizer ... se o url é index.php? Catid = 3 & sort = data e ano = 2009 & page = 2 e eu gostaria de ter o salto de usuário para a página 3, ou alterar o método de classificação ..... como que eu iria preservar os vars restantes sem verificar para cada var indivíduo com um if / else condição e eco-las no link que ligaria para a página 3 ou o método de classificação alternativa.

Foi útil?

Solução

Para lidar com consulta real cordas (formato string), você pode usar parse_str() . Quando você quer construir uma cadeia de consulta, use http_build_query() .

Há muito poucos exemplos nessas páginas de documentação.

Se por algum motivo você não pode usar http_build_query, veja a minha pergunta sobre o caminho mais rápido para implodir uma série associativo.

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

Outras dicas

PHP fornece-lhe um $ _GET global, que detém a cadeia de consulta todos muito bem analisado em elementos

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

etc

Você pode resetar os que você não quer passar adiante e depois passar para nova url via algo como:

$get = array_intersect_key($_GET, array_keys($_GET));
unset($get['sort']);
$url = 'target.php?' . http_build_query($get);

Se você quer dizer que você gostaria que o link para a página 3 só seria

index.php?page=3

ou link para mudar o método de classificação só seria

index.php?sort=date

Você teria que armazenar as outras variáveis ?? variáveis ??de sessão (ou cookies, se você quer que eles se persistir por mais tempo).

Algo parecido com isto:

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

Embora a maioria das soluções fornecidas aqui vai funcionar, eu acho que a maneira mais simples de fazer isso será

// 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

É isso. Por favor, consulte a documentação on http_build_query() e parse_str() (que é uma daquelas funções cujo nome foi completey confuso - ninguém esperaria que a função para fazer o que ele faz apenas olhando o nome).

Eu tive o mesmo problema com um "construir me um classificáveis, Tabela pageable" general classe. É por isso que alguém inventou subprocedimentos chamadas "funções" em php.

Você tem que criar uma função que lida com exatamente o processo de construção da ligação. como assim:

/**
* $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);
}

código não testado! Usam seus cérebros

ou você pode usar $ _SESSION-vars para pageing e selecção (um' material) e têm ligações apenas mudar aqueles (que é o que eu mais faço hoje em dia)

Adicione o nome eo valor da variável no final da string de consulta (mudança de página para 3):

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

Em seguida, depois de extrair $ _GET, use uma função simples para verificar se x e y são set.

Se forem, definir a variável cujo nome está contido em x com o valor y.

Você pode usar o mesmo link em todos os lugares com uma simples adição ao final, e a quantidade de programação é mínima.

não gerenciar a string diretamente, mas gerenciar um array (key => value) representação dele e só traduzi-lo de volta à corda quando necessário.

Uma forma possível de fazê-lo:

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top