Diziden sorgu dizesi oluşturmak için PHP işlevi


165

Ben anahtar değeri çiftleri bir dizi bir sorgu dizesi oluşturmak için PHP işlevinin adını arıyorum. Unutmayın, bunu yapmak için yerleşik PHP işlevini arıyorum , homebrew değil (hepsi bir google araması geri geliyor gibi görünüyor). Bir tane var, sadece adını hatırlayamıyorum veya php.net'te bulamıyorum. IIRC'nin adı o kadar sezgisel değil.

Yanıtlar:


312

Arıyorsunuz http_build_query().


Bu PHP 5'ten edinilebilen oldukça yeni bir işlev.
Calmarius

15
Bu işleve dikkat edin! Değerin NULL olduğu tüm anahtar / değer çiftlerini atlar. echo http_build_query(array("foo"=>"bar","bar"=>null))sadece üretecekfoo=bar
cb0

@ cb0 bu, tarayıcıdaki form gönderimlerine benzer şekilde çalışır, gönderilen sorguya boş bir giriş alanı eklenmez.
TJ L

1
@ceejayoz Bunu uzun zamandır biliyorsunuz ... Dileğiniz gerçekleşti mi?
Andrew

21

İşte basit bir php4 dostu uygulama:

/**
* Builds an http query string.
* @param array $query  // of key value pairs to be used in the query
* @return string       // http query string.
**/
function build_http_query( $query ){

    $query_array = array();

    foreach( $query as $key => $key_value ){

        $query_array[] = urlencode( $key ) . '=' . urlencode( $key_value );

    }

    return implode( '&', $query_array );

}

30
Bu bir php4 sürümüdür.
0x6A75616E

1
Kod çözme işlemi sırasında PHP anahtarın yüzde kodunu çözüyor gibi görünüyor. Muhtemelen burada yapmaya değer mi?
cloudfeet

@cloudfeet bunu yapmak için makul görünüyor. Gösterdiğiniz için teşekkürler.
0x6A75616E

2

Tıpkı @thatjuancevabına ek olarak .
Bunun daha uyumlu PHP4 sürümü:

if (!function_exists('http_build_query')) {
    if (!defined('PHP_QUERY_RFC1738')) {
        define('PHP_QUERY_RFC1738', 1);
    }
    if (!defined('PHP_QUERY_RFC3986')) {
        define('PHP_QUERY_RFC3986', 2);
    }
    function http_build_query($query_data, $numeric_prefix = '', $arg_separator = '&', $enc_type = PHP_QUERY_RFC1738)
    {
        $data = array();
        foreach ($query_data as $key => $value) {
            if (is_numeric($key)) {
                $key = $numeric_prefix . $key;
            }
            if (is_scalar($value)) {
                $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($key) : rawurlencode($key);
                $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($value) : rawurlencode($value);
                $data[] = "$k=$v";
            } else {
                foreach ($value as $sub_k => $val) {
                    $k = "$key[$sub_k]";
                    $k = $enc_type == PHP_QUERY_RFC3986 ? urlencode($k) : rawurlencode($k);
                    $v = $enc_type == PHP_QUERY_RFC3986 ? urlencode($val) : rawurlencode($val);
                    $data[] = "$k=$v";
                }
            }
        }
        return implode($arg_separator, $data);
    }
}

-2

Bu soru oldukça eski ve PHP için, burada (şu anda) çok popüler PHP çerçevesi Laravel'de yapmanın bir yolu.

Sorgu dizesini uygulamanızdaki bir yol için kodlamak için rota adlarınızı verin ve ardından route()yardımcı işlevi şu şekilde kullanın:

route('documents.list.', ['foo' => 'bar']);

Sonuç şuna benzer:

http://localhost/documents/list?foo=bar

Ayrıca, rotanızda herhangi bir yol segmenti parametresi /documents/{id}varsa id, route()parametrelere de bir argüman ilettiğinizden emin olun , aksi takdirde varsayılan olarak ilk parametrenin değerini kullanacaktır.


-3

Implode , bir diziyi sizin için bir dizede birleştirir, ancak bir kay / değer çiftinden bir SQL sorgusu yapmak için kendi işlevinizi yazmanız gerekir.


Bunu denedim ama işe yaramayacak. Implode bunu yapamam, anahtarlar ve diziden değerleri gerektiren bir http sorgu dizesi oluşturmaya çalışıyorum.
Robin Barnes

2
Bir SQL sorgu dizesi mi yoksa bir http sorgu dizesi mi demek istediğinizden emin değildim.
Click Olumlu oy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.