GET मापदंडों को जोड़कर एक url स्ट्रिंग को जोड़ दें


95

मैं URL में GET पैरामीटर जोड़ना चाहता हूं जो दोहराए बिना ?या बिना GET पैरामीटर शामिल नहीं हो सकता है &

उदाहरण:

अगर मैं जोड़ना चाहता हूं category=action

$url="http://www.acme.com";
 // will add ?category=action at the end

$url="http://www.acme.com/movies?sort=popular";
 // will add &category=action at the end

यदि आप ध्यान दें कि मैं प्रश्न चिह्न को दोहराने की कोशिश नहीं कर रहा हूँ अगर यह पाया जाता है।

URL केवल एक स्ट्रिंग है।

एक विशिष्ट GET पैरामीटर को जोड़ने का एक विश्वसनीय तरीका क्या है?


सीधे शब्दों में का उपयोग करें: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। लेकिन आपको संगीतकार के माध्यम से jakeasmith / http_build_url की आवश्यकता होगी pecl install pecl_httpया स्थापित करना होगा
Ema4rl

जवाबों:


190

मूल विधि

$query = parse_url($url, PHP_URL_QUERY);

// Returns a string if the URL has parameters or NULL if not
if ($query) {
    $url .= '&category=1';
} else {
    $url .= '?category=1';
}

अधिक उन्नत

$url = 'http://example.com/search?keyword=test&category=1&tags[]=fun&tags[]=great';

$url_parts = parse_url($url);
// If URL doesn't have a query string.
if (isset($url_parts['query'])) { // Avoid 'Undefined index: query'
    parse_str($url_parts['query'], $params);
} else {
    $params = array();
}

$params['category'] = 2;     // Overwrite if exists
$params['tags'][] = 'cool';  // Allows multiple values

// Note that this will url_encode all values
$url_parts['query'] = http_build_query($params);

// If you have pecl_http
echo http_build_url($url_parts);

// If not
echo $url_parts['scheme'] . '://' . $url_parts['host'] . $url_parts['path'] . '?' . $url_parts['query'];

आपको इसे कम से कम एक फ़ंक्शन में रखना चाहिए, यदि कोई वर्ग नहीं है।


2
श्रेणी का मान जोड़ना न भूलें
डग टी।

4
@DougT। सभी मापदंडों को एक मूल्य की आवश्यकता नहीं है। उदाहरण के लिए, ?logoutके साथ जाँच की जा सकतीisset($_GET["logout"])
rybo111

यह दृष्टिकोण अच्छा है जब आप जानते हैं कि 'श्रेणी' पैरामीटर पहले से ही URL में नहीं है। यदि पैरामीटर पहले से ही URL में है तो PHP को URL में पैरामीटर की अंतिम घटना का मान लेना चाहिए, इसलिए @andrewtweber का समाधान अभी भी काम करता है। फिर भी, मुझे निम्नलिखित समाधान पसंद हैं stackoverflow.com/a/4101638/99256 बेहतर।
मार्टिन विसेटीका

-1 के पैरामीटर को बदलने के लिए नहीं अगर यह पहले से मौजूद है। यह प्रश्न में स्पष्ट रूप से उल्लिखित नहीं है, लेकिन यह तार्किक और शब्दार्थ से अनिवार्य है।
डैनियल डब्ल्यू

1
सीधे शब्दों में का उपयोग करें: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। लेकिन आपको संगीतकार के माध्यम से jakeasmith / http_build_url की आवश्यकता होगी pecl install pecl_httpया स्थापित करना होगा
Ema4rl

58

यहां स्वीकृत उत्तर का एक छोटा संस्करण है:

$url .= (parse_url($url, PHP_URL_QUERY) ? '&' : '?') . 'category=action';

संपादित करें: जैसा कि स्वीकृत उत्तर में चर्चा की गई है, यह त्रुटिपूर्ण है कि यह देखने के लिए जाँच नहीं करता है कि क्या categoryपहले से मौजूद है। एक बेहतर समाधान $_GETयह है कि यह क्या है, इसके लिए इलाज करें - एक सरणी - और जैसे कार्यों का उपयोग करें in_array()


ध्यान दें कि यह केवल एकल जोड़े गए पैरामीटर के साथ काम करेगा, अन्यथा यह ए करेगा? अगर कोई मूल क्वेरी नहीं थी।
ममगर्ज़

@ मैगमरज़ जब तक मैं आपको गलत नहीं समझ रहा हूँ, वही ओपी ने पूछा है। यह .पहले की वजह से कई बार काम करता है =
rybo111

लेकिन अभ्यस्त क्वेरी मौजूद नहीं है यदि आप url में एक पैरामीटर जोड़ते हैं (इसलिए एक जोड़ना?), और यदि आप इसे फिर से करते हैं तो यह एक और जोड़ देगा? (जब तक आप पहली पंक्ति को फिर से चलाने के लिए नहीं हैं)? $ क्वेरी कैसे अपडेट होती है?
ममगेरेज़

@ मैगमरेज़ मैं देख रहा हूं कि अब आपका क्या मतलब है। हां, आपको यह जांचने के लिए पहली बार प्रत्येक पंक्ति को दोहराना होगा कि क्या $urlपहले से ही पैरामीटर है। संपादित।
rybo111

1
के साथ URL को हैंडल नहीं करता है #
नैट्स

20
$data = array('foo'=>'bar',
              'baz'=>'boom',
              'cow'=>'milk',
              'php'=>'hypertext processor');

$queryString =  http_build_query($data);
//$queryString = foo=bar&baz=boom&cow=milk&php=hypertext+processor

echo 'http://domain.com?'.$queryString;
//output: http://domain.com?foo=bar&baz=boom&cow=milk&php=hypertext+processor

सीधे शब्दों में का उपयोग करें: echo http_build_url($url, array("query" => "the=query&parts=here"), HTTP_URL_JOIN_QUERY);। लेकिन आपको संगीतकार के माध्यम से jakeasmith / http_build_url की आवश्यकता होगी pecl install pecl_httpया स्थापित करना होगा
Ema4rl

8

पता लगाने के लिए स्ट्रैप्स का उपयोग करें ? जबसे ? केवल एक क्वेरी स्ट्रिंग की शुरुआत में URL में दिखाई दे सकता है, आपको पता है कि क्या इसके परमान पहले से मौजूद हैं और आपको अधिक विवरण जोड़ने की आवश्यकता है

function addGetParamToUrl(&$url, $varName, $value)
{
    // is there already an ?
    if (strpos($url, "?"))
    {
        $url .= "&" . $varName . "=" . $value; 
    }
    else
    {
        $url .= "?" . $varName . "=" . $value;
    }
}

यदि आप प्रदर्शन के बारे में चिंतित हैं तो अच्छा और आसान तरीका है, क्योंकि यह पार्स_ल की तुलना में बहुत तेज़ होगा और कम सीपीयू गहन भी होगा। Tradeoff यह है कि यह मौजूदा $ varName के लिए जाँच नहीं कर रहा है।
डेनिस स्टुकेन

क्लासिक गलती सीधे खंड () रिटर्न का उपयोग करने के लिए है यदि सीधे खंड। $url .= (strpos($url, '?') === false ? '?' : '&').'category=action'; और प्रदर्शन बुद्धिमान एकल उद्धरण का उपयोग करना बेहतर होगा। इसके अलावा, यह समाधान आवश्यकताओं को बेहतर ढंग से फिट करता है।
सर्गेई कोवलेंको

8

यह फ़ंक्शन किसी मौजूदा तर्क को अधिलेखित करता है

function addToURL( $key, $value, $url) {
    $info = parse_url( $url );
    parse_str( $info['query'], $query );
    return $info['scheme'] . '://' . $info['host'] . $info['path'] . '?' . http_build_query( $query ? array_merge( $query, array($key => $value ) ) : array( $key => $value ) );
}

अगर कोई $info['query']सेट नहीं है तो क्या होगा ? आपने उसका कोई हिसाब नहीं रखा है।
डैरेन

यदि सेट नहीं किया जाता है, तो $ जानकारी ['क्वेरी'] NULL हो जाती है और $ क्वेरी एक खाली सरणी बन जाती है। तो यह एक मुद्दा नहीं है।
अजय सिंह

7

अस्तित्व के मापदंडों को अद्यतन करने के साथ उदाहरण।

इसके अलावा उपयोग किया गया url_encode, और पैरामीटर मान निर्दिष्ट नहीं करने की संभावना है

    <?
    /**
     * Add parameter to URL
     * @param string $url
     * @param string $key
     * @param string $value
     * @return string result URL
     */
    function addToUrl($url, $key, $value = null) {
        $query = parse_url($url, PHP_URL_QUERY);
        if ($query) {
            parse_str($query, $queryParams);
            $queryParams[$key] = $value;
            $url = str_replace("?$query", '?' . http_build_query($queryParams), $url);
        } else {
            $url .= '?' . urlencode($key) . '=' . urlencode($value);
        }
        return $url;
    }

5
<?php
$url1 = '/test?a=4&b=3';
$url2 = 'www.baidu.com/test?a=4&b=3&try_count=1';
$url3 = 'http://www.baidu.com/test?a=4&b=3&try_count=2';
$url4 = '/test';
function add_or_update_params($url,$key,$value){
    $a = parse_url($url);
    $query = $a['query'] ? $a['query'] : '';
    parse_str($query,$params);
    $params[$key] = $value;
    $query = http_build_query($params);
    $result = '';
    if($a['scheme']){
        $result .= $a['scheme'] . ':';
    }
    if($a['host']){
        $result .= '//' . $a['host'];
    }
    if($a['path']){
        $result .=  $a['path'];
    }
    if($query){
        $result .=  '?' . $query;
    }
    return $result;
}
echo add_or_update_params($url1,'try_count',1);
echo "\n";
echo add_or_update_params($url2,'try_count',2);
echo "\n";
echo add_or_update_params($url3,'try_count',3);
echo "\n";
echo add_or_update_params($url4,'try_count',4);
echo "\n";

3
महान कार्य, केवल पंक्ति $query = $a['query'] ? $a['query'] : '';को प्रतिस्थापित करें$query = isset($a['query']) ? $a['query'] : '';
emmgfx

4
 /**
 * @example addParamToUrl('/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('//example.com/path/to/?find=1', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 * @example addParamToUrl('https://example.com/path/to/?find=1&FILTER=Y', array('find' => array('search', 2), 'FILTER' => 'STATUS'))
 *
 * @param       $url string url
 * @param array $addParams
 *
 * @return string
 */
function addParamToUrl($url, array $addParams) {
  if (!is_array($addParams)) {
    return $url;
  }

  $info = parse_url($url);

  $query = array();

  if ($info['query']) {
    parse_str($info['query'], $query);
  }

  if (!is_array($query)) {
    $query = array();
  }

  $params = array_merge($query, $addParams);

  $result = '';

  if ($info['scheme']) {
    $result .= $info['scheme'] . ':';
  }

  if ($info['host']) {
    $result .= '//' . $info['host'];
  }

  if ($info['path']) {
    $result .= $info['path'];
  }

  if ($params) {
    $result .= '?' . http_build_query($params);
  }

  return $result;
}

3
$parameters = array();

foreach ($get as $key => $value)
{
     $parameters[] = $key.'='.$value;
}

$url = 'http://example.com/movies?'.implode('&', $parameters);

3

मुझे लगता है कि आपको इसे कुछ इस तरह करना चाहिए।

class myURL {
    protected $baseURL, $requestParameters;

    public function __construct ($newURL) {
        $this->baseurl = $newURL;
        $this->requestParameters = array();
    }

    public function addParameter ($parameter) {
        $this->requestParameters[] = $parameter;
    }

    public function __toString () {
        return $this->baseurl.
               ( count($this->requestParameters) ?
                 '?'.implode('&', $this->requestParameters) :
                 ''
                 );
    }
}

$url1 = new myURL ('http://www.acme.com');
$url2 = new myURL ('http://www.acme.com');
$url2->addParameter('sort=popular');
$url2->addParameter('category=action');
$url1->addParameter('category=action');

echo $url1."\n".$url2;

1

इस विषय पर कई संसाधनों / उत्तरों की खोज करने के बाद, मैंने खुद को कोड करने का निर्णय लिया। यहाँ @ टेलरऑटलवेल के उत्तर के आधार पर, यह है कि मैं आने वाले $ _GET अनुरोध को कैसे संसाधित करता हूं और प्रत्येक तत्व को संशोधित / हेरफेर करता हूं।

मान लीजिए कि url है: http://domain.com/category/page.php?a=b&x=y और मैं छँटाई के लिए केवल एक ही पैरामीटर चाहता हूँ: या तो? Desc = column_name या? Asc = column_name। इस तरह, एकल url पैरामीटर एक साथ क्रमबद्ध और क्रमबद्ध करने के लिए पर्याप्त है। तो URL संबंधित तालिका शीर्ष लेख पंक्ति के पहले क्लिक पर http://domain.com/category/page.php?a=b&x=y&desc=column_name होगा ।

फिर मेरे पास टेबल रो हेडिंग है जिसे मैं अपने पहले क्लिक पर डेस्क सॉर्ट करना चाहता हूं, और उसी हेडिंग के दूसरे क्लिक पर एएससी। (प्रत्येक पहले क्लिक पर "ORDER BY कॉलम DESC" पहले होना चाहिए) और यदि कोई छँटाई नहीं है, तो यह डिफ़ॉल्ट रूप से "तिथि फिर आईडी" के आधार पर छाँटेगा।

आप इसे और बेहतर कर सकते हैं, जैसे आप प्रत्येक $ _GET घटक में सफाई / फ़िल्टरिंग फ़ंक्शंस जोड़ सकते हैं, लेकिन नीचे की संरचना नींव खो देती है।

foreach ($_GET AS $KEY => $VALUE){
    if ($KEY == 'desc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE DESC";
        $URL_ORDER = $URL_ORDER . "&asc=$VALUE";
    } elseif ($KEY == 'asc'){
        $SORT = $VALUE;
        $ORDER = "ORDER BY $VALUE ASC";
        $URL_ORDER = $URL_ORDER . "&desc=$VALUE";
    } else {
        $URL_ORDER .= "&$KEY=$VALUE";
        $URL .= "&$KEY=$VALUE";
    }
}
if (!$ORDER){$ORDER = 'ORDER BY date DESC, id DESC';}
if ($URL_ORDER){$URL_ORDER = $_SERVER[SCRIPT_URL] . '?' . trim($URL_ORDER, '&');}
if ($URL){$URL = $_SERVER[SCRIPT_URL] . '?' . trim($URL, '&');}

(आप http://domain.com से शुरू होने वाले पूर्ण URL के लिए $ _SERVER [SCRIPT_URI] का उपयोग कर सकते हैं )

तब मैं MySQL क्वेरी में ऊपर प्राप्त $ ORDER का उपयोग करता हूं:

"SELECT * FROM table WHERE limiter = 'any' $ORDER";

अब URL देखने का कार्य यदि कोई पिछली छँटाई है और URL को ""? या अनुक्रम के अनुसार "&":

        function sort_order ($_SORT){
            global $SORT, $URL_ORDER, $URL;
            if ($SORT == $_SORT){
                return $URL_ORDER;
            } else {
                if (strpos($URL, '?') !== false){
                    return "$URL&desc=$_SORT";
                } else {                        
                    return "$URL?desc=$_SORT";
                }
            }
        }

अंत में, फ़ंक्शन का उपयोग करने के लिए तालिका पंक्ति शीर्षलेख:

        echo "<th><a href='".sort_order('id')."'>ID</a></th>";

सारांश: यह URL पढ़ेगा, $ _GET घटकों में से प्रत्येक को संशोधित करेगा और आपकी पसंद के सही रूप के साथ आपकी पसंद के मापदंडों के साथ अंतिम URL बनाएगा? " तथा "&"


0
 public function addGetParamToUrl($url, $params)
{
    foreach ($params as $param) {
         if (strpos($url, "?"))
        {
            $url .= "&" .http_build_query($param); 
        }
        else
        {
            $url .= "?" .http_build_query($param); 
        }
    }
    return $url;
}

0

एक और बेहतर फ़ंक्शन संस्करण। छोटे सुधार (पोर्ट समर्थन) और बगफिक्स (ठीक से कुंजियों की जांच) के साथ मौजूदा उत्तरों का मिश्रण।

/**
 * @param string $url original url to modify - can be relative, partial etc
 * @param array $paramsOverride associative array, can be empty
 * @return string modified url
 */
protected function overrideUrlQueryParams($url, $paramsOverride){
    if (!is_array($paramsOverride)){
        return $url;
    }

    $url_parts = parse_url($url);

    if (isset($url_parts['query'])) {
        parse_str($url_parts['query'], $params);
    } else {
        $params = [];
    }

    $params = array_merge($params, $paramsOverride);

    $res = '';

    if(isset($url_parts['scheme'])) {
        $res .= $url_parts['scheme'] . ':';
    }

    if(isset($url_parts['host'])) {
        $res .= '//' . $url_parts['host'];
    }

    if(isset($url_parts['port'])) {
        $res .= ':' . $url_parts['port'];
    }

    if (isset($url_parts['path'])) {
        $res .= $url_parts['path'];
    }

    if (count($params) > 0) {
        $res .= '?' . http_build_query($params);
    }

    return $res;
}

0

URL पैरामीटर को जोड़ने के लिए इस फ़ंक्शन का प्रयास करें ।

तब आप लिंक को अक्षम कर सकते हैं जब पैरामीटर सेट किया जाता है ताकि कोई यूआरएल पैरामीटर डुप्लिकेट न हो।

<?php
  function addQueryString($a)
                {
             if (empty($_SERVER['QUERY_STRING']))
               return '?' . $a;
             else if (!empty($_SERVER['QUERY_STRING']))
              return '?' . $_SERVER['QUERY_STRING'] . '&' . $a;
                }
?>

 <a href="<?php echo addQueryString('lang=en'); ?>">test</a>
 <a href="<?php echo addQueryString('category=5'); ?>">sat</a>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.