รับพารามิเตอร์สตริงการสืบค้น 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
Timo Huovinen

3
เพื่อให้ได้ผลผลิตที่สามารถอ่านได้มากขึ้นคุณสามารถตัดprint_r()งบในTags:<pre> echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';
Amal Murali

1
@RJAnoop ในกรณีนั้น qstring เป็นส่วนหนึ่งของ URL เพื่อให้คุณสามารถใช้ได้$_SERVER['REQUEST_URI']แม้ว่าคุณอาจต้องการพิจารณาใช้ mod_rewrite เพื่อส่งผ่านส่วนของ URL นั้นเป็นตัวแปร ดูstackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
เหตุใดจึงดีกว่าการใช้ $ _GET
Still_dreaming_1

92

วิธี PHP ในการใช้ฟังก์ชันparse_urlซึ่งแยกวิเคราะห์ URL และส่งคืนคอมโพเนนต์ รวมถึงสตริงแบบสอบถาม

ตัวอย่าง:

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

เอกสารฉบับเต็มได้ที่นี่


15
นี่เป็นคำตอบที่ดีที่สุดตามคำถาม คำตอบอื่น ๆ จะได้รับURI ปัจจุบันเท่านั้นในขณะที่คำถามนั้นระบุว่า "จาก URL" เท่านั้น
Chris Harrison

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และซึ่งจะทำให้รหัสเสี่ยงต่อการโจมตีเช่น$yhttp://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อาร์เรย์จะมีค่าสตริงข้อความค้นหาทั้งหมด
Amal Murali

13
"คุณไม่ควรเปลี่ยนพารามิเตอร์การสอบถามเป็นตัวแปรอย่างสุ่มสี่สุ่มห้า" ข้อความเหล่านี้ไร้สาระทั้งหมด "ไม่เคย" -> คุณจะรู้ได้อย่างไรว่าสถานการณ์ใดที่ coder ที่กำหนดจะได้รับในชั่วโมงสุ่มของวันทำงานแบบสุ่ม ........ เรื่องไร้สาระแน่นอน ไม่มีคำเช่น 'ไม่เคย' สิ่งใดเป็นสิ่งที่อันตรายเมื่อคุณใช้มันผิดสิ่งที่มีประโยชน์เมื่อคุณใช้ถูกต้อง ....... เมื่อ 10 ปีที่แล้วมีคนมากมายที่พูดเช่นนั้นเกี่ยวกับ IFRAME ความชั่วร้าย, ความโง่เขลาอย่างแน่นอน ความเสี่ยงด้านความปลอดภัยแน่นอน จากนั้นก็เข้า Facebook แล้วเข้าสังคม iframes ทุกที่และไม่มีใครพูดอย่างนั้นในตอนนี้ ....
unity100


25

ฉันจะแนะนำคำตอบที่ดีที่สุดเช่น

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

สมมติว่าผู้ใช้ป้อนhttp://example.com/?name=Hannes

ตัวอย่างด้านบนจะแสดงผล:

สวัสดีฮันเนส!


4
นี่เป็นวิธีที่เร็วและง่ายที่สุดในการรับ vars จากสตริงการสืบค้นที่กำหนด
Mirko Brunner

2
สหกรณ์ถามว่าจะได้รับพระรามแบบสอบถามจาก URL example.com/?Hannes...
ฟิลิปป์

5

นอกจากนี้หากคุณกำลังมองหาชื่อไฟล์ปัจจุบันพร้อมกับสตริงการสืบค้นคุณจะต้องติดตามสิ่งต่อไปนี้

basename($_SERVER['REQUEST_URI'])

มันจะให้ข้อมูลเหมือนตัวอย่างต่อไปนี้

file.php? arg1 = Val & arg2 = Val

และถ้าคุณต้องการพา ธ แบบเต็มของไฟล์เช่นกันโดยเริ่มจากรูตเช่น /folder/folder2/file.php?arg1=val&arg2=val จากนั้นให้ลบฟังก์ชัน basename () และใช้ fillowing

$_SERVER['REQUEST_URI']

2
/เป็นอักขระที่ถูกต้องในสตริงการสืบค้น (ดูRFC 3986 ) ดังนั้นคุณไม่สามารถไว้ใจbasenameได้
Cairnarvon

1
สิ่งนี้จะไม่ทำงานหากการสอบถามมีเครื่องหมายทับในนั้นและดังนั้นจึงไม่ปลอดภัย คุณดีกว่าที่จะได้รับการสอบถามลบออกจากจุดสิ้นสุดของคำขอ URI แล้วเรียกใช้ basename () - แน่นอนเพิ่ม querystring ไปยังจุดสิ้นสุด
Zenexer

4

นี่คือฟังก์ชั่นของฉันเพื่อสร้างชิ้นส่วนของสตริงการสืบค้นของ REFERRER

หากหน้าการโทรมีข้อความค้นหาในURLของตัวเองอยู่แล้วและคุณต้องกลับไปที่หน้านั้นและต้องการส่งกลับบางส่วนของ$_GETvars นั้น ๆ ไม่ใช่ทั้งหมด(เช่นหมายเลขหน้า)

ตัวอย่าง: สตริงแบบสอบถามของเล่นที่ได้รับการ?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

รหัสและสัญลักษณ์นี้ไม่ใช่ของฉัน Evan K แก้แบบสอบถามชื่อเดียวกันหลายค่าด้วยฟังก์ชั่นที่กำหนดเอง;) นำมาจาก:

http://php.net/manual/th/function.parse-str.php#76792 เครดิตไปที่ Evan K.

มันกล่าวถึงว่า parse_str builtin ไม่ประมวลผลสตริงแบบสอบถามในวิธีมาตรฐาน 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 Shahzad สิ่งนี้จะช่วยเมื่อคุณต้องการสตริงการสืบค้นที่เขียนซ้ำโดยไม่มีการเพิ่มการเขียนซ้ำใด ๆ สมมติว่าคุณเขียน / 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
Kamlesh

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

อาจมีบางกรณีที่เราต้องการแปลงพารามิเตอร์ข้อความค้นหาเป็นประเภทจำนวนเต็มดังนั้นฉันจึงเพิ่มพารามิเตอร์ตัวที่สามในฟังก์ชันนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.