URL क्वेरी स्ट्रिंग पैरामीटर प्राप्त करें


322

URL क्वेरी स्ट्रिंग से पैरामीटर प्राप्त करने के लिए "कम कोड आवश्यक" तरीका क्या है जो निम्न की तरह स्वरूपित है?

www.mysite.com/category/subcategory?myqueryhash

आउटपुट होना चाहिए: myqueryhash

मैं इस दृष्टिकोण से अवगत हूँ:

www.mysite.com/category/subcategory?q=myquery

<?php
   echo $_GET['q'];  //Output: myquery
?>

जवाबों:


527

$_SERVER['QUERY_STRING'] उस डेटा को शामिल करता है जिसे आप खोज रहे हैं।


प्रलेखन


28
संबंधित मूल्यों को खोजने के लिए print_r ($ _ SERVER)

22
ध्यान दें: $_SERVER['QUERY_STRING']दिखाएगा foo=bar2की तरह क्वेरी स्ट्रिंग के लिएfoo=bar1&foo=bar2
टीमो Huovinen

3
अधिक पठनीय उत्पादन पाने के लिए आपको लपेट कर सकते हैं print_r()में बयान <pre>टैग: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
अमल मुरली

1
@RJAnoop उस मामले में, qstring URL का हिस्सा है, जिससे आप उपयोग कर सकते हैं $_SERVER['REQUEST_URI'], हालाँकि आप URL के उस हिस्से को एक चर के रूप में पारित करने के लिए mod_rewrite का उपयोग करने पर विचार कर सकते हैं। देखें stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
तो यह $ _GET का उपयोग करने से बेहतर क्यों है?
still_dreaming_1

91

इसे करने का PHP तरीका फ़ंक्शन parse_url का उपयोग कर रहा है , जो एक URL को पार्स करता है और उसके घटकों को वापस करता है। जिसमें क्वेरी स्ट्रिंग शामिल है।

उदाहरण:

$url = 'www.mysite.com/category/subcategory?myqueryhash';
echo parse_url($url, PHP_URL_QUERY); # output "myqueryhash"

पूर्ण प्रलेखन यहाँ


15
यह वास्तव में प्रश्न के आधार पर सबसे अच्छा उत्तर है। अन्य उत्तर केवल वर्तमान यूआरआई प्राप्त करते हैं जबकि प्रश्न केवल "URL से" निर्दिष्ट करता है।
क्रिस हैरिसन

80

फ़ंक्शन parse_str()स्वचालित रूप से सभी क्वेरी पैरामीटर को एक सरणी में पढ़ता है।

उदाहरण के लिए, यदि URL है http://www.example.com/page.php?x=100&y=200, तो कोड

$queries = array();
parse_str($_SERVER['QUERY_STRING'], $queries);

$queriesसरणी ( $queries['x']=100, $queries['y']=200) में पैरामीटर स्टोर करेगा ।

को देखो parse_str के प्रलेखन


संपादित करें

PHP प्रलेखन के अनुसार, parse_str()केवल एक दूसरे पैरामीटर के साथ उपयोग किया जाना चाहिए। का उपयोग करते हुए parse_str($_SERVER['QUERY_STRING'])इस URL पर चर पैदा करेगा $xऔर $yहै, जो कोड जैसे हमले के लिए असुरक्षित बना देता है http://www.example.com/page.php?authenticated=1


52
..और एक बुराई, बुराई कार्य है जिसका अस्तित्व नहीं होना चाहिए।
Zenexer

6
Zenexer आप अपने बयान को थोड़ा और विस्तृत कर सकते हैं? यह एक बुराई क्यों है?
sbrbot

26
आपको कभी भी आँख बंद करके मापदंडों में फेरबदल नहीं करना चाहिए। आपको क्या लगता है कि अगर कोई ऐसी कुंजी का उपयोग करता है जो वास्तविक चर से मेल खाती है? यह कारनामे पूछ रहा है। इसलिए यह सुविधा अत्यधिक हतोत्साहित करती है। आप PHP को स्वचालित रूप से ऐसा करने के लिए सेट कर सकते हैं, बिना कॉलिंग के parse_str, लेकिन स्वाभाविक रूप से, इसे नो-नो माना जाता है।
Zenexer

42
आप parse_str () के दूसरे पैरामीटर का उपयोग कर सकते हैं। - parse_str($_SERVER['QUERY_STRING'], $params);- अब $paramsसरणी में सभी क्वेरी स्ट्रिंग मान होंगे।
अमल मुरली

13
"आपको कभी भी आँख बंद करके मापदंडों में फेरबदल नहीं करना चाहिए" इस तरह के कथन पूरी तरह से बेतुके हैं। "नेवर" -> आपको कैसे पता चलेगा कि किसी भी दिए गए कोडर में किस तरह की परिस्थितियां एक यादृच्छिक कार्यदिवस के एक यादृच्छिक घंटे पर अनुभव करेंगी ........ निरपेक्ष बकवास। 'कभी नहीं ’जैसा कोई शब्द नहीं है। कुछ भी खतरनाक है जब आप इसे गलत उपयोग करते हैं, कुछ भी उपयोगी होता है जब आप इसे सही उपयोग करते हैं ....... 10 साल पहले बहुत से लोग IFRAME के ​​बारे में इस तरह की बात कर रहे थे। बुराई, पूर्ण मूर्खता। पूर्ण सुरक्षा जोखिम। तब आया facebook, फिर आया सोशल, iframes हर जगह और कोई नहीं बात कर रहा है अब की तरह ....
unity100


25

मैं सबसे अच्छे उत्तर की सिफारिश करूंगा

<?php echo 'Hello ' . htmlspecialchars($_GET["name"]) . '!'; ?>

मान लिया कि उपयोगकर्ता ने http://example.com/?name=Hannes दर्ज किया है

उपरोक्त उदाहरण आउटपुट होगा:

हैलो हनीस!


4
यह दिए गए क्वेरी स्ट्रिंग से vars प्राप्त करने का सबसे तेज़ और सबसे आसान तरीका है।
मिरको ब्रूनर

2
ओपी ने पूछा कि URL से क्वेरी परम कैसे प्राप्त करें example.com/?Hannes...
फिलिप्पुस

5

यदि आप क्वेरी स्ट्रिंग के साथ-साथ वर्तमान फ़ाइल नाम की तलाश कर रहे हैं, तो आपको बस निम्नलिखित की आवश्यकता होगी

basename($_SERVER['REQUEST_URI'])

यह आपको निम्नलिखित उदाहरण जैसी जानकारी प्रदान करेगा

file.php? ARG1 = वैल और ARG2 = वैल

और अगर आप रूट से शुरू होने के साथ-साथ फाइल का पूरा रास्ता भी चाहते हैं, जैसे /folder/folder2/file.php?arg1=val&arg2=val तो बस बेसनेम () फ़ंक्शन को हटा दें और सिर्फ फिलिंग का उपयोग करें

$_SERVER['REQUEST_URI']

2
/क्वेरी स्ट्रिंग्स में एक मान्य वर्ण है ( RFC 3986 देखें ), इसलिए आप भरोसा नहीं कर सकते basename
केयर्नवॉन

1
यह काम नहीं करेगा अगर क्वेरिस्ट्रिंग में एक स्लैश है, और इसलिए असुरक्षित है। आप क्वेरिस्ट्रिंग प्राप्त करना बेहतर मानते हैं, इसे अनुरोध URI के अंत से हटाते हैं, फिर बेसनेम () चला रहे हैं - फिर, निश्चित रूप से, क्वेरिस्ट्रिंग को अंत में जोड़ें।
ज़ेनेक्सर

4

यहाँ मेरा कार्य REFERRER के क्वेरी स्ट्रिंग के कुछ हिस्सों का पुनर्निर्माण करना है ।

यदि कॉलिंग पेज में पहले से ही अपने स्वयं के URL में एक क्वेरी स्ट्रिंग थी , और आपको उस पेज पर वापस जाना होगा और कुछ को वापस भेजना होगा, न कि सभी $_GETसंस्करण (जैसे एक पेज नंबर)।

उदाहरण: रेफ़रर की क्वेरी स्ट्रिंग रिटर्न ?foo=1&bar=2&baz=3कह रही थी :refererQueryString( 'foo' , 'baz' )foo=1&baz=3"

function refererQueryString(/* var args */) {

    //Return empty string if no referer or no $_GET vars in referer available:
    if (!isset($_SERVER['HTTP_REFERER']) ||
        empty( $_SERVER['HTTP_REFERER']) ||
        empty(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_QUERY ))) {

        return '';
    }

    //Get URL query of referer (something like "threadID=7&page=8")
    $refererQueryString = parse_url(urldecode($_SERVER['HTTP_REFERER']), PHP_URL_QUERY);

    //Which values do you want to extract? (You passed their names as variables.)
    $args = func_get_args();

    //Get '[key=name]' strings out of referer's URL:
    $pairs = explode('&',$refererQueryString);

    //String you will return later:
    $return = '';

    //Analyze retrieved strings and look for the ones of interest:
    foreach ($pairs as $pair) {
        $keyVal = explode('=',$pair);
        $key = &$keyVal[0];
        $val = urlencode($keyVal[1]);
        //If you passed the name as arg, attach current pair to return string:
        if(in_array($key,$args)) {
            $return .= '&'. $key . '=' .$val;
        }
    }

    //Here are your returned 'key=value' pairs glued together with "&":
    return ltrim($return,'&');
}

//If your referer was 'page.php?foo=1&bar=2&baz=3'
//and you want to header() back to 'page.php?foo=1&baz=3'
//(no 'bar', only foo and baz), then apply:

header('Location: page.php?'.refererQueryString('foo','baz'));

4

यह कोड और नोटेशन मेरा नहीं है। इवान के एक कस्टम फ़ंक्शन के साथ एक बहु मूल्य नाम नाम क्वेरी हल करता है;) से लिया गया है:

http://php.net/manual/en/function.parse-str.php#76792 क्रेडिट इवान के।

यह उल्लेख करता है कि parse_str buildin CGI मानक तरीके से क्वेरी स्ट्रिंग को संसाधित नहीं करता है, जब यह डुप्लिकेट फ़ील्ड की बात आती है। यदि एक ही नाम के कई फ़ील्ड क्वेरी स्ट्रिंग में मौजूद हैं, तो हर दूसरी वेब प्रसंस्करण भाषा उन्हें एक सरणी में पढ़ती है, लेकिन PHP चुपचाप उन्हें अधिलेखित कर देता है:

<?php
# silently fails to handle multiple values
parse_str('foo=1&foo=2&foo=3');

# the above produces:
$foo = array('foo' => '3');
?>

Instead, PHP uses a non-standards compliant practice of including brackets in fieldnames to achieve the same effect.

<?php
# bizarre php-specific behavior
parse_str('foo[]=1&foo[]=2&foo[]=3');

# the above produces:
$foo = array('foo' => array('1', '2', '3') );
?>

This can be confusing for anyone who's used to the CGI standard, so keep it in mind.  As an alternative, I use a "proper" querystring parser function:

<?php
function proper_parse_str($str) {
  # result array
  $arr = array();

  # split on outer delimiter
  $pairs = explode('&', $str);

  # loop through each pair
  foreach ($pairs as $i) {
    # split into name and value
    list($name,$value) = explode('=', $i, 2);

    # if name already exists
    if( isset($arr[$name]) ) {
      # stick multiple values into an array
      if( is_array($arr[$name]) ) {
        $arr[$name][] = $value;
      }
      else {
        $arr[$name] = array($arr[$name], $value);
      }
    }
    # otherwise, simply stick it in a scalar
    else {
      $arr[$name] = $value;
    }
  }

  # return result array
  return $arr;
}

$query = proper_parse_str($_SERVER['QUERY_STRING']);
?>

3

@K को धन्यवाद। शहजाद यह तब मदद करता है जब आप बिना किसी पुनर्लेखन जोड़ के फिर से लिखना चाहते हैं। मान लें कि आप / test / /? X = y को index.php? Q = test & x = y में पुनः लिखते हैं और आप केवल क्वेरी स्ट्रिंग चाहते हैं।

function get_query_string(){

    $arr = explode("?",$_SERVER['REQUEST_URI']);
    if (count($arr) == 2){
        return "";
    }else{
        return "?".end($arr)."<br>";
    }       
}
$query_string = get_query_string();

2

प्रोग्रामिंग भाषा: PHP

// Inintialize URL to the variable 
$url = 'https://www.youtube.com/watch?v=qnMxsGeDz90'; 

// Use parse_url() function to parse the URL 
// and return an associative array which 
// contains its various components 
$url_components = parse_url($url); 

// Use parse_str() function to parse the 
// string passed via URL 
parse_str($url_components['query'], $params); 

// Display result 
echo 'v parameter value is '.$params['v'];

इसने मेरे लिए काम किया। मुझे उम्मीद है, यह आपकी मदद भी करेगा :)


आउटपुट: v पैरामीटर मान qnMxsGeDz90
कमलेश

1

URI में प्रत्येक नोड प्राप्त करने के लिए, आप explode()$ _SERVER ['REQUEST_URI'] में फ़ंक्शन का उपयोग कर सकते हैं । यदि आप यह जानना चाहते हैं कि क्या गुजरता है या नहीं तो बिना तार के। आप $ _REQUEST से क्वेरी पैरामीटर प्राप्त करने के लिए स्वयं को परिभाषित फ़ंक्शन का उपयोग कर सकते हैं (क्योंकि यह POST और GET params दोनों के लिए काम करता है)।

function getv($key, $default = '', $data_type = '')
{
    $param = (isset($_REQUEST[$key]) ? $_REQUEST[$key] : $default);

    if (!is_array($param) && $data_type == 'int') {
        $param = intval($param);
    }

    return $param;
}

कुछ मामले हो सकते हैं जब हम क्वेरी पैरामीटर को इंटेगर प्रकार में परिवर्तित करना चाहते हैं, इसलिए मैंने इस फ़ंक्शन में तीसरा पैरामीटर जोड़ा।

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