ইউআরএল কোয়েরি স্ট্রিং পরামিতি পান


322

নীচের মত ফর্ম্যাট করা ইউআরএল কোয়েরি স্ট্রিং থেকে প্যারামিটারগুলি পাওয়ার জন্য "কম কোডের প্রয়োজনীয়" উপায় কী?

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
প্রিন্ট_আর (S _ সার্ভার) সম্পর্কিত মানগুলি সন্ধান করতে

22
দ্রষ্টব্য: কোয়েরি স্ট্রিংয়ের মতো $_SERVER['QUERY_STRING']দেখাবেfoo=bar2foo=bar1&foo=bar2
টিমো হুভিনেন

3
একটি আরো ভালো পঠনযোগ্য আউটপুট পেতে, আপনি মোড়ানো পারেন print_r()মধ্যে বিবৃতি <pre>ট্যাগ: echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
অমল মুরালি

1
@RJAnoop সেক্ষেত্রে Qstring ইউআরএল এর একটি অংশ যাতে আপনি ব্যবহার করতে পারেন $_SERVER['REQUEST_URI'], যদিও আপনি ইউআরএল এর সেই অংশটি ভেরিয়েবল হিসাবে পাস করার জন্য মোড_উইরাইট ব্যবহার করে বিবেচনা করতে পারেন। দেখুন stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
তাহলে কেন এটি $ _GET ব্যবহারের চেয়ে ভাল?
এখনও_ড্রিমিং_1

91

এটি করার পিএইচপি উপায়টি হ'ল ফাংশনটি ব্যবহার করা উপায়টি পার্স_আর্ল যা কোনও ইউআরএল পার্স করে এবং এর উপাদানগুলি ফেরত দেয়। ক্যোরি স্ট্রিং সহ।

উদাহরণ:

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

এখানে সম্পূর্ণ ডকুমেন্টেশন


15
এটি আসলে প্রশ্নের ভিত্তিতে সেরা উত্তর। অন্যান্য উত্তরগুলি কেবলমাত্র বর্তমান ইউআরআই পায় যেখানে প্রশ্নটি কেবল "ইউআরএল থেকে" নির্দিষ্ট করে।
ক্রিস হ্যারিসন

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()কেবলমাত্র দ্বিতীয় প্যারামিটার ব্যবহার করা উচিত। parse_str($_SERVER['QUERY_STRING'])এই ইউআরএল ব্যবহার করে ভেরিয়েবল তৈরি হবে $xএবং $yযা কোডকে আক্রমণে যেমন দুর্বল করে তোলে http://www.example.com/page.php?authenticated=1


52
.. এবং এটি একটি অশুভ, অশুভ ফাংশন যার অস্তিত্ব থাকা উচিত নয়।
জেনেক্সার

6
জেনেক্সার আপনি কি আপনার বক্তব্যকে আরও কিছুটা ব্যাখ্যা করতে পারবেন? কেন এটি একটি মন্দ?
sbrbot

26
আপনার জিজ্ঞাসাবাদ পরামিতিগুলিকে কখনই ভেরিয়েবলগুলিতে পরিণত করা উচিত নয়। কেউ যদি সত্যিকারের ভেরিয়েবলের সাথে মিলে এমন কী ব্যবহার করে তবে কী হবে? এটা শোষণ চাইছে। এই কারণেই এই বৈশিষ্ট্যটি অত্যন্ত নিরুৎসাহিত। আপনি কল না করে স্বয়ংক্রিয়ভাবে এটি করার জন্য পিএইচপি সেট করতে পারেন parse_str, তবে স্বাভাবিকভাবেই, এটি একটি হ'ল নয়।
জেনেক্সার

42
আপনি parse_str () এর দ্বিতীয় প্যারামিটার ব্যবহার করতে পারেন। - parse_str($_SERVER['QUERY_STRING'], $params);- এখন $paramsঅ্যারেতে সমস্ত ক্যোয়ারী স্ট্রিংয়ের মান থাকবে।
অমল মুরালি

13
"আপনারা কখনই অন্বেষণ করে ক্যোরিস্ট্রিং প্যারামিটারগুলিকে ভেরিয়েবলগুলিতে পরিণত করবেন না" এই জাতীয় বিবৃতি সম্পূর্ণ অযৌক্তিক। "কখনই নয়" -> আপনি কীভাবে জানবেন যে কোনও প্রদত্ত কোডার একটি এলোমেলো ওয়ার্কডে এলোমেলো ঘন্টা সময় কীভাবে পরিস্থিতি অনুভব করবে ........ পরম বোকামি। 'কখনই নয়' বলে কোনও শব্দ নেই। আপনি যখন এটি ভুল ব্যবহার করেন তখন কিছুই বিপজ্জনক, আপনি যখন এটি সঠিকভাবে ব্যবহার করেন তখন কিছু কার্যকর হয় ....... 10 বছর আগে প্রচুর লোক IFRAMEs সম্পর্কিত এ জাতীয় কথা বলছিল। মন্দ, পরম বোকামি। নিরঙ্কুশ সুরক্ষা ঝুঁকি। তারপরে ফেসবুক এসেছিল, তারপরে সামাজিক এসেছে, সর্বত্র iframes হয়েছে এবং এখনই কেউ
নন


25

আমি সেরা উত্তর হিসাবে সুপারিশ করব

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

ব্যবহারকারী ধরে নিলেন http://example.com/?name=Hannes

উপরের উদাহরণটি আউটপুট দেবে:

হ্যালো হ্যানস!


4
প্রদত্ত ক্যোয়ারী স্ট্রিং থেকে ওয়ার্স পাওয়ার এটি দ্রুত এবং সহজতম উপায়।
মিরকো ব্রুনার

2
ওপি জিজ্ঞাসা করেছিল যে কীভাবে ইউআরএল থেকে ক্যোয়ারী পরম পাবেন example.com/?Hannes...
ফিলিপ

5

এছাড়াও আপনি যদি ক্যোয়ারী স্ট্রিংয়ের সাথে বর্তমান ফাইলটির নাম সন্ধান করছেন তবে আপনার কেবল নিম্নলিখিতগুলি প্রয়োজন

basename($_SERVER['REQUEST_URI'])

এটি আপনাকে নীচের উদাহরণের মতো তথ্য সরবরাহ করবে

file.php? ARG1 = Val & ARG2 = Val

এবং আপনি যদি ফাইলের পুরো পথটিও রুট থেকে শুরু করতে চান যেমন, /folder/folder2/file.php?arg1=val&arg2=val তবে কেবল বেসনাম () ফাংশনটি সরিয়ে ফেলুন এবং ফিলিংয়ের ব্যবহার করুন

$_SERVER['REQUEST_URI']

2
/ক্যোয়ারী স্ট্রিংগুলিতে একটি বৈধ অক্ষর ( আরএফসি 3986 দেখুন ), সুতরাং আপনি নির্ভর করতে পারবেন না basename
কেয়ারনারভন

1
ক্যোরিস্ট্রিংয়ে এতে স্ল্যাশ থাকলে এটি কাজ করবে না এবং তাই অনিরাপদ। আপনি ইউআরআই অনুরোধের শেষে থেকে সরিয়ে ক্যোরিস্ট্রিংটি অর্জন করা ভাল, তারপরে বেসনাম () চালাচ্ছেন - তবে অবশ্যই ক্যোরিস্ট্রিংটি শেষের দিকে যুক্ত করুন।
জেনেক্সার

4

রেফারগুলির অংশগুলি পুনর্নির্মাণের জন্য এখানে আমার ফাংশন ক্যোয়ারী স্ট্রিংয়ের কিছু ।

যদি কলিং পৃষ্ঠার ইতিমধ্যে নিজের ইউআরএলটিতে কোয়েরি স্ট্রিং থাকে এবং আপনাকে অবশ্যই সেই পৃষ্ঠায় ফিরে যেতে হবে এবং তার কিছু না কিছু পাঠাতে চাইছেন of$_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 ক্রেডিটগুলি ইভান কেতে যায়

এটি উল্লেখ করা যায় যে পার্স_স্ট্র্ট বিল্টিন সিজিআই স্ট্যান্ডার্ড উপায়ে কোয়েরি স্ট্রিং প্রক্রিয়া করে না, যখন এটি সদৃশ ক্ষেত্রে আসে। যদি একই নামের একাধিক ক্ষেত্রগুলি কোয়েরি স্ট্রিংয়ে উপস্থিত থাকে তবে প্রতিটি অন্যান্য ওয়েব প্রসেসিং ভাষা সেগুলি অ্যারেতে পড়তে পারে, কিন্তু পিএইচপি নিঃশব্দে সেগুলি ওভাররাইট করে:

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

@ কে ধন্যবাদ। শাহজাদ এটি যখন আপনি পুনর্লিখিত ক্যোয়ারী স্ট্রিং কোনও পুনর্লিখন সংযোজন ছাড়াই চান তখন এটি সহায়তা করে। ধরা যাক আপনি / টেস্ট /? 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

প্রোগ্রামিং ভাষা: পিএইচপি

// 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'];

এটি আমার পক্ষে কাজ করেছে। আমি আশা করি, এটি আপনাকেও সহায়তা করবে :)


আউটপুট: ভি প্যারামিটার মান qnMxsGeDz90
কমলেশ

1

ইউআরআইতে প্রতিটি নোড পাওয়ার জন্য, আপনি function explode()_SERVER ['REQUEST_URI'] এ ফাংশনটি ব্যবহার করতে পারেন । আপনি পাস করতে পারছেন কিনা তা না জেনে স্ট্রিং পেতে চাইলে। আপনি myself _REQUEST থেকে ক্যোয়ারী প্যারামিটারগুলি পাওয়ার জন্য আমি নিজেকে সংজ্ঞায়িত ফাংশনটি ব্যবহার করতে পারি (এটি POST এবং GET উভয় প্যারামের জন্য কাজ করে)।

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;
}

আমরা যখন ক্যোয়ারী প্যারামিটারগুলি পূর্ণসংখ্যার ধরণের রূপান্তরিত করতে চাই তখন কিছু ক্ষেত্রে থাকতে পারে, তাই আমি এই ফাংশনে তৃতীয় পরামিতি যুক্ত করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.