2010-10-20 44 views
9

Hãy nói rằng tôi nhận được yêu cầu như:Nhiều thông số HTTP GET với cùng định danh

http://www.example.com/index.php?id=123&version=3&id=234&version=4

Có thể trích xuất chúng trong một cách đơn giản bên trong mã php của tôi? Tôi nhận ra tôi có thể nhận được toàn bộ chuỗi truy vấn với javascript bằng cách sử dụng window.location.href và xử lý nó bằng tay nhưng tôi đang tìm kiếm một cái gì đó thanh lịch hơn. Các yêu cầu có thể chứa bất kỳ số cặp phiên bản/id nào nhưng tôi có thể giả định rằng truy vấn được tạo đúng và không có nghĩa vụ xử lý các chuỗi không hợp lệ.

+0

Có thể thay đổi định dạng chuỗi truy vấn không? chẳng hạn như 'index.php? bản ghi [id] [] = 123 & ghi [phiên bản] [] = 3 & ghi [id] [] = 234 & ghi [phiên bản] [] = 4' để bạn có thể lấy chúng bằng bản ghi' $ _GET [" "] [" id "] [0] # = 123' và' $ _GET ["bản ghi"] ["phiên bản"] [0] # = 3' – PeterWong

+0

Trong khi chuỗi truy vấn được xây dựng bằng phần mềm của công ty chúng tôi, ứng dụng khách có từ lâu đã được phân phối và cài đặt trên hàng nghìn máy tính. Bản cập nhật tiếp theo của phần mềm đó có thể chứa các thay đổi về cú pháp, nhưng vì chức năng này liên quan đến các cập nhật tự động của phần mềm, nó cần phải làm việc với trạng thái hiện tại của các truy vấn. – MatsT

+0

Điều này có thể, xem bài đăng này: http://stackoverflow.com/questions/353379/how-to-get-multiple-parameters-with-same-name-from-a-url-in-php –

Trả lời

7

Theo this comment from the PHP manual, trình phân tích cú pháp chuỗi truy vấn của PHP sẽ xóa các tham số trùng lặp ... vì vậy tôi không nghĩ rằng PHP phù hợp với những gì bạn muốn làm (ngoại trừ ở chỗ nó có cùng dung lượng như javascript để lấy chuỗi truy vấn liệu, mà bạn có thể làm bất cứ điều gì bạn muốn)

+10

+1 Điều này có vẻ khá ngu ngốc về phía PHP, tôi nghĩ rằng bất kỳ nền tảng khác hỗ trợ các tham số http đa giá trị mà không có vấn đề. – leonbloy

+0

Có một ví dụ về mã cho một chức năng sửa lỗi trong chính chú thích đó, cảm ơn bạn. – MatsT

+1

PHP hỗ trợ điều này. Các biến chuỗi truy vấn đa giá trị đi vào một mảng và có thể được truy cập từ đó. Không cần giải pháp. Không phải là một vấn đề PHP. – mmundiff

22

Nếu bạn có thể thay đổi tên trường để bao gồm [], sau đó PHP sẽ tạo ra một mảng chứa tất cả các giá trị phù hợp:

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4 

Nếu bạn không có khả năng thay đổi tên trường, như bạn nói, bạn sẽ phải phân tích cú pháp chuỗi truy vấn của bạn f.

+1

Không nên thay đổi 'id {}' thành 'id []'? –

+0

Yup. Cố định, cảm ơn. –

+0

Có ai có thể trỏ đến một địa điểm tại http://php.net/manual/en/index.php nơi tính năng đó được ghi chép? –

1

Giả sử bạn có một số quyền kiểm soát đối với yêu cầu, hãy đặt tên là [] và PHP sẽ tạo mảng thay vì bỏ tất cả trừ một.

http://www.example.com/index.php?id[]=123&version[]=3&id[]=234&version[]=4 

Vì họ là cặp có thể bạn sẽ muốn sửa chữa theo thứ tự chúng xuất hiện trong việc sử dụng các chỉ số.

http://www.example.com/index.php?id[0]=123&version[0]=3&id[1]=234&version[1]=4 
1

Chỉ cần trích xuất các khóa và giá trị của $ _GET, sử dụng các chức năng như:

print_array('$_GET...',$_GET); 

... và mã chức năng sẽ là:

function print_array($title, $arr) { 
    echo '<table width="100%" style="padding:10;">'; 
    echo '<tr><td width="30%" style="text-align:right; background-color:bisque;">key of </td><td style="background-color:bisque;">'.$title.'</td></tr>'; 
    foreach($arr as $key => $value) { 
     echo '<tr>'; 
      echo '<td style="text-align:right; color:grey;">'; 
       echo $key; 
      echo '</td>'; 
      echo '<td>'; 
       echo $value; 
      echo '</td>'; 
     echo '</tr>'; 
    } 
    echo '</table>'; 
} 
0

Không tròn trịa hay đáng tin cậy như các phương pháp được đề cập ở trên nhưng tôi sử dụng phương pháp này để xóa nhu cầu về số [] trong url mà không phải lo lắng về việc viết lại.

$aQuery = explode("&", $_SERVER['QUERY_STRING']); 
$aQueryOutput = array(); 
foreach ($aQuery as $param) { 
    if(!empty($param)){ 
     $aTemp = explode('=', $param, 2); 
     if(isset($aTemp[1]) && $aTemp[1] !== ""){ 
      list($name, $value) = explode('=', $param, 2); 
      $aQueryOutput[ strtolower(urldecode($name)) ][] = urldecode(preg_replace('/[^a-z 0-9\'+-]/i', "", $value)); 
     } 
    } 
} 
Các vấn đề liên quan