2010-04-09 29 views
5

Nghe có vẻ lạ, nhưng trong ứng dụng PHP của tôi, tôi cần kiểm tra xem tên biến đã được khai báo nhiều lần trong chuỗi truy vấn hay biến POST và trả lại giá trị lỗi nếu trường hợp này xảy ra. Nếu ứng dụng của tôi không trả lại lỗi trong trường hợp này, ứng dụng sẽ không kiểm tra tính tuân thủ.PHP: Cách kiểm tra xem chuỗi truy vấn hoặc POST có chứa cùng một var hai lần

Khi truy cập vars bằng cách sử dụng $ _GET, $ _POST, v.v., PHP chỉ trả về giá trị cuối cùng cho mỗi tên biến. Tôi không thể tìm cách để biết liệu có biến nào xuất hiện nhiều lần không.

Tôi chỉ cần tìm hiểu xem chuỗi truy vấn hoặc các biến trong nội dung POST có chứa cùng tên biến nhiều hơn một lần hay không, bất kể giá trị nào.

Ví dụ

Ứng dụng của tôi có nghĩa vụ phải trả lại một lỗi cho chuỗi truy vấn này:

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc 

Lưu ý rằng "metadataPrefix" được định nghĩa hai lần.

Ứng dụng của tôi không nên trả về một lỗi cho chuỗi truy vấn này:

verb=ListIdentifiers&metadataPrefix=oai_dc 
+0

Tôi bắt đầu nghĩ rằng "biểu thức chính quy". Hmm dunno làm thế nào tôi sẽ làm điều đó mặc dù. – thomasrutter

+0

Bạn có thể gửi mẫu mã không. –

Trả lời

10

POST yêu cầu

$input = file_get_contents('php://input'); 

(Hoặc $HTTP_RAW_POST_DATA (docs))

GET yêu cầu

$input = $_SERVER['QUERY_STRING']; 

Processing
explode('&', $input) và duy trì một mảng - $foundKeys - của các phím (một phần của mỗi mục từ explode() trước ký tự =). Nếu bạn nhấn một phím đã được xác định trong $foundKeys, hãy ném lỗi.

+0

Liên quan đến phần "Đang xử lý": Nếu bạn đã biết trước đối số có thể trùng lặp - hãy nói: "metadataPrefix" - bạn chỉ có thể tìm kiếm một số kết quả phù hợp trên "metadataPrefix =" ở đầu mỗi mục "explode()' 'ed. – jensgram

+0

... hoặc sử dụng 'substr_count()' như được đề xuất trong câu trả lời của @Christopher Nadeau, loại bỏ sự cần thiết phải phát nổ() 'ngay từ đầu :) – jensgram

+0

thx - phát nổ ('&', $ input) là tốt đẹp và dễ dàng – thomasrutter

-1

Nếu bạn mong đợi nhiều giá trị đặt tên cho biến với dấu ngoặc vuông cuối cùng. Bằng cách này bạn sẽ nhận được một mảng cho biến đó. Nếu nhiều giá trị được đặt, mảng sẽ có nhiều mục nhập.

<input type="checkbox" name="my_var[]" value="a"> 
<input type="checkbox" name="my_var[]" value="b"> 

$ _POST ['my_var'] sẽ là mảng có 'a' hoặc 'b', cả hai hoặc không phụ thuộc vào hộp kiểm được sử dụng.

2

Để có dữ liệu GET, hãy xem $_SERVER['QUERY_STRING']. Nhưng đối với dữ liệu POST, bạn cần phải đọc dữ liệu POST thô từ luồng php://input.

Vì vậy, một cái gì đó như thế này:

// GET data: 
$raw = $_SERVER['QUERY_STRING']; 

// Or for POST data: 
$raw = file_get_contents("php://input"); 

if (substr_count('&'.$raw, '&metadataPrefix=') > 1) 
    die('Error'); 
print_r($raw); //post vars 
0

PHP $ _POST sẽ luôn đặt chỉ có một giá trị cho mỗi biến trừ khi yêu cầu tên biến kết thúc với [].

Nếu bạn không kiểm soát các biến được gửi, bạn có thể thử sử dụng $ _SERVER ['RAW_HTTP_POST_DATA'] để nhận dữ liệu yêu cầu POST ban đầu trước khi được phân tích cú pháp, sau đó bạn có thể sử dụng hàm parse_str() để phân tích chuỗi đó .

Hãy cẩn thận rằng cấu hình PHP có thể đã tắt cài đặt giá trị RAW_HTTP_POST_DATA. Trong trường hợp đó, bạn không thể làm bất cứ điều gì để giải quyết vấn đề của bạn.

0

Không hoàn toàn hết sức rõ ràng nhưng điều này có thể làm việc

$occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix='); 
Các vấn đề liên quan