Nhận tham số chuỗi truy vấn URL


322

Cách "ít mã cần thiết hơn" để nhận các tham số từ chuỗi truy vấn URL được định dạng như sau là gì?

www.mysite.com/carget/subc Category? myqueryhash

Đầu ra phải là: myqueryhash

Tôi nhận thức được phương pháp này:

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

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

Câu trả lời:


527

$_SERVER['QUERY_STRING'] chứa dữ liệu mà bạn đang tìm kiếm.


TÀI LIỆU


28
print_r ($ _ SERVER) để tìm các giá trị liên quan

22
lưu ý: $_SERVER['QUERY_STRING']sẽ hiển thị foo=bar2cho chuỗi truy vấn nhưfoo=bar1&foo=bar2
Timo Huovinen

3
Để có được đầu ra dễ đọc hơn, bạn có thể gói print_r()câu lệnh trong <pre>thẻ : echo '<pre>'.print_r($_SERVER, TRUE).'</pre>';.
Amal Murali

1
@RJAnoop Trong trường hợp đó, q chuỗi là một phần của URL để bạn có thể sử dụng $_SERVER['REQUEST_URI'], mặc dù bạn có thể muốn xem xét sử dụng mod_rewrite để chuyển phần đó của URL dưới dạng một biến. Xem stackoverflow.com/questions/16388959/url-rewriting-with-php
nullability

5
Vậy tại sao điều này tốt hơn việc sử dụng $ _GET?
still_dreaming_1

92

Cách thức để thực hiện PHP là sử dụng hàm parse_url , phân tích cú pháp một URL và trả về các thành phần của nó. Bao gồm chuỗi truy vấn.

Thí dụ:

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

Tài liệu đầy đủ tại đây


15
Đây thực sự là câu trả lời tốt nhất dựa trên câu hỏi. Các câu trả lời khác chỉ nhận được URI hiện tại trong khi câu hỏi chỉ xác định "từ URL".
Chris Harrison

80

Hàm parse_str()tự động đọc tất cả các tham số truy vấn thành một mảng.

Ví dụ: nếu URL là http://www.example.com/page.php?x=100&y=200, mã

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

sẽ lưu các tham số vào $queriesmảng ( $queries['x']=100, $queries['y']=200).

Nhìn vào tài liệu của parse_str


BIÊN TẬP

Theo tài liệu PHP, parse_str()chỉ nên được sử dụng với tham số thứ hai. Sử dụng parse_str($_SERVER['QUERY_STRING'])trên URL này sẽ tạo ra các biến $x$y, điều này làm cho mã dễ bị tấn công như http://www.example.com/page.php?authenticated=1.


52
..và là một chức năng xấu xa, xấu xa không nên tồn tại.
Zenexer

6
Zenexer bạn có thể xây dựng tuyên bố của bạn nhiều hơn một chút? Tại sao điều này là một ác?
sbrbot

26
Bạn không bao giờ nên mù quáng biến các tham số chuỗi truy vấn thành các biến. Bạn nghĩ điều gì sẽ xảy ra nếu ai đó sử dụng một khóa tương ứng với một biến thực? Đó là yêu cầu khai thác. Đó là lý do tại sao tính năng này rất được khuyến khích. Bạn có thể thiết lập PHP để thực hiện việc này một cách tự động mà không cần gọi parse_str, nhưng một cách tự nhiên, nó được coi là không.
Zenexer

42
Bạn có thể sử dụng tham số thứ hai của parse_str (). - parse_str($_SERVER['QUERY_STRING'], $params);- bây giờ $paramsmảng sẽ chứa tất cả các giá trị chuỗi truy vấn.
Amal Murali

13
"Bạn không bao giờ nên mù quáng biến các tham số chuỗi truy vấn thành các biến" Các câu lệnh như vậy là hoàn toàn vô lý. "Không bao giờ" -> làm thế nào để bạn biết loại tình huống mà bất kỳ lập trình viên nào sẽ gặp phải vào một giờ ngẫu nhiên của một ngày làm việc ngẫu nhiên ........ Hoàn toàn vô nghĩa. Không có từ nào là "không bao giờ". MỌI THỨ rất nguy hiểm khi bạn sử dụng sai, BẤT CỨ điều gì hữu ích khi bạn sử dụng đúng ....... 10 năm trước, rất nhiều người đã nói như vậy về IFRAME. xấu xa, ngu ngốc tuyệt đối. rủi ro bảo mật tuyệt đối. rồi đến facebook, rồi xã hội, iframe ở khắp mọi nơi và bây giờ không ai nói chuyện như vậy ....
unity100


25

Tôi sẽ đề nghị câu trả lời tốt nhất như

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

Giả sử người dùng đã nhập http://example.com/?name=Hannes

Ví dụ trên sẽ xuất ra:

Xin chào Hannes!


4
Đây là cách nhanh nhất và dễ nhất để lấy các vars từ chuỗi truy vấn đã cho.
Mirko Brunner

2
OP đã hỏi làm thế nào để có được thông số truy vấn từ URL example.com/?Hannes...
Philipp

5

Ngoài ra nếu bạn đang tìm kiếm tên tệp hiện tại cùng với chuỗi truy vấn, bạn sẽ chỉ cần theo dõi

basename($_SERVER['REQUEST_URI'])

Nó sẽ cung cấp cho bạn thông tin như ví dụ sau đây

file.php? arg1 = val & arg2 = val

Và nếu bạn cũng muốn đường dẫn đầy đủ của tệp cũng bắt đầu từ root, ví dụ /folder/folder2/file.php?arg1=val&arg2=val thì chỉ cần xóa hàm basename () và chỉ cần sử dụng hàm

$_SERVER['REQUEST_URI']

2
/là một ký tự hợp lệ trong các chuỗi truy vấn (xem RFC 3986 ), vì vậy bạn không thể dựa vào basename.
Cairnarvon

1
Điều này sẽ không hoạt động nếu chuỗi truy vấn có dấu gạch chéo trong đó và do đó không an toàn. Tốt hơn hết là bạn nên lấy chuỗi truy vấn, loại bỏ nó khỏi cuối URI yêu cầu, sau đó chạy tên cơ sở () - sau đó, tất nhiên, thêm chuỗi truy vấn vào cuối.
Zenexer

4

Đây là chức năng của tôi để xây dựng lại các phần của chuỗi truy vấn của REAXRER .

Nếu trang gọi đã có một chuỗi truy vấn trong URL riêng của nó và bạn phải quay lại trang đó và muốn gửi lại một số chứ không phải tất cả các $_GETvars đó (ví dụ: số trang).

Ví dụ: Chuỗi truy vấn của người giới thiệu đã ?foo=1&bar=2&baz=3gọi refererQueryString( 'foo' , 'baz' )trả về 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

Mã và ký hiệu này không phải của tôi. Evan K giải một truy vấn cùng tên nhiều giá trị với hàm tùy chỉnh;) được lấy từ:

http://php.net/manual/en/feft.parse-str.php#76792 Tín dụng vào Evan K.

Nó đề cập đến việc xây dựng parse_str KHÔNG xử lý chuỗi truy vấn theo cách tiêu chuẩn CGI, khi nói đến các trường trùng lặp. Nếu nhiều trường cùng tên tồn tại trong một chuỗi truy vấn, mọi ngôn ngữ xử lý web khác sẽ đọc chúng thành một mảng, nhưng PHP âm thầm ghi đè lên chúng:

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

Cảm ơn @K. Shahzad Điều này giúp khi bạn muốn chuỗi truy vấn được viết lại mà không có bất kỳ bổ sung viết lại nào. Giả sử bạn viết lại / test /? X = y thành index.php? Q = test & x = y và bạn chỉ muốn chuỗi truy vấn.

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

Ngôn ngữ lập trình: 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'];

Điều này làm việc cho tôi. Tôi hy vọng, nó cũng sẽ giúp bạn :)


Output: v giá trị tham số là qnMxsGeDz90
Kamlesh

1

Để nhận từng nút trong URI, bạn có thể sử dụng hàm explode()thành $ _SERVER ['REQUEST_URI']. Nếu bạn muốn nhận chuỗi mà không biết nó có được thông qua hay không. bạn có thể sử dụng hàm tôi tự xác định để nhận các tham số truy vấn từ $ _REQUEST (vì nó hoạt động cả cho các tham số POST và 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;
}

Có thể có một số trường hợp khi chúng tôi muốn nhận các tham số truy vấn được chuyển đổi thành loại Số nguyên, vì vậy tôi đã thêm tham số thứ ba cho hàm này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.