簡體   English   中英

在php中管理QUERY_STRING的最佳方法是什么?

[英]Whats the best way to manage QUERY_STRING in php?

我的一個網站除了分頁功能外,還具有一些非常復雜的排序功能,並且各種變量加起來構成一個非常復雜的URL,這是一個巨大的管理難題。 有沒有辦法有效地管理QUERY_STRING?

我的意思是...如果網址是index.php?catid = 3&sort = date&year = 2009&page = 2,並且希望用戶跳至第3頁,或更改排序方法.....我將如何保存其余的變量,而不用if / else條件檢查每個變量,並在鏈接到第3頁或其他排序方法的鏈接中回顯它們。

PHP為您提供了一個全局$ _GET,其中保存了所有很好地解析為元素的查詢字符串

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

等等

您可以取消設置您不想傳遞的內容,然后通過類似以下內容移至新的網址:

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

要處理實際的查詢字符串 (字符串格式),可以使用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

如果您要表示到第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>';
?>

盡管此處提供的大多數解決方案都可以使用,但我認為最簡單的方法是

// 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()文檔(這是名稱完全被弄亂的那些函數之一-沒有人會期望該函數僅通過查看名稱即可完成其工作)。

我遇到了與一般的“為我建立一個可排序,可分頁的表格”類完全相同的問題。 這就是為什么有人在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進行分頁和排序(一個“東西”),並且僅更改那些鏈接(這是我如今最常做的事情)

在查詢字符串的末尾添加變量名稱和值(將頁面更改為3):

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

然后,在提取$ _GET之后,使用一個簡單的函數檢查是否設置了x和y。

如果它們是,請將名稱包含在x中的變量設置為值y。

您可以在任何地方使用相同的鏈接,並在最后添加一個簡單的鏈接,並且編程量很小。

不要直接管理字符串,而是管理它的數組(鍵=>值)表示形式,僅在需要時才將其轉換回字符串。

一種可行的方式:

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM