Nedir php QUERY_STRING yönetmek için en iyi yolu nedir?

7 Cevap php

Benim sitelerin biri pagination üstüne, bazı çok karmaşık sıralama işlevleri vardır, ve çeşitli değişkenleri yönetmek için büyük bir ağrı oldukça karmaşık bir URL ekleyebilirsiniz. Verimli QUERY_STRING yönetmek için bir yolu var mı?

Bu demek ... url catid = 3 & sort = date & year = 2009 & = 2 sayfa? Index.php ve ben sayfa 3 kullanıcı atlamayı sahibi olmak isteyen, ya da sıralama yöntemini değiştirmek eğer ... .. nasıl bir if / else koşulu ile her var kontrol etmeden kalan değişkenler korumak ve sayfa 3 veya alternatif sıralama yöntemi bağlayacak bağlantı onları yankı.

7 Cevap

Gerçek sorgu strings (string format) işlemek için, parse_str() . When you want to build a query string, use http_build_query() kullanabilirsiniz.

Bu dokümantasyon sayfalarda epeyce örnek var.

Nedense sen http_build_query, fastest way to implode an associative array ilgili sorumu kontrol kullanamazsınız.

<?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 size tüm güzel unsurları ayrıştırılır sorgu dizesi tutan bir global $ _GET malzemeleri

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

vb

Eğer iletmekten ve sonra gibi bir şey ile yeni url taşımak istemiyorum olanları unset olabilir:

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

Eğer sayfa 3 için bağlantı sadece olacağını istiyorum anlamına eğer

index.php?page=3

veya sıralama yöntemini değişen bağlantı sadece olurdu

index.php?sort=date

Sen (siz onları daha uzun devam etmek istiyorsanız, ya da kurabiye) session variables diğer değişkenleri saklamak gerekir.

Böyle bir şey:

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

Burada sağlanan çözümlerin çoğu çalışacak olsa da, bunu yapmak için en basit yolu olacağını düşünüyorum

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

İşte bu. Bu isim completey berbat oldu bu işlevlerin biri (http_build_query() and parse_str() belgelerine bakın - kimse işlevi sadece bakarak ne yapmak için beklediğiniz ) isim.

Ben genel bir "Bana bir yapı sıralanabilir, sayfalanabilir Masa" sınıfı ile aynı sorun vardı. Birisi icat öğrenci alt php "fonksiyonlar" olarak adlandırılan nedeni budur.

Tam olarak bağlantı kurma sürecini işleyen bir işlevi oluşturmak zorunda. şöyle:

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

Denenmemiş KODU! Beynini kullan

veya (bir 'şeyler) pageing ve sıralama için $ _SESSION-değişkenler kullanabilir ve bağlantılar sadece (i çoğunlukla günümüzde ne olduğu) olanlar değiştirmek var

(3 sayfa değiştirme) sorgu dizesinin sonunda değişken adını ve değerini ekleyin:

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

Sonra, $ _GET ayıkladıktan sonra, x ve y ayarlanmış olup olmadığını kontrol etmek için basit işlevini kullanın.

Onlar ise, ismi y değeri için x içerdiği değişkeni ayarlayın.

Sen sonunda basit bir ek ile her yerde aynı linki kullanabilirsiniz ve programlama miktarı az.

Doğrudan dize yönetmek ama bunun bir dizi (anahtar => değer) temsil yönetmek ve yalnızca gerektiğinde geri dizeye çevirmek etmeyin.

Bunu yapmanın bir yolu da:

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;