PHP: как проверить, содержит ли строка запроса или POST-вары одинаковые переменные дважды

Это может показаться странным, но в моем приложении PHP мне нужно проверить, было ли одно и то же имя переменной объявлено более одного раза в строке запроса или переменные POST и вернуть значение ошибки, если это так. Если мое приложение не возвращает ошибку в этом случае, оно не выполняет проверку соответствия.

При доступе к варам с использованием $ _GET, $ _POST и т. Д. PHP возвращает только последнее значение, заданное для каждого имени переменной. Я не могу найти способ узнать, появилась ли какая-либо переменная более одного раза.

Мне просто нужно выяснить, содержит ли строка запроса или переменные в элементе POST одно и то же имя переменной, независимо от значений.

пример

Мое приложение должно возвращать ошибку для этой строки запроса:

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc 

Обратите внимание, что «metadataPrefix» определяется дважды.

Мое приложение не должно возвращать ошибку для этой строки запроса:

 verb=ListIdentifiers&metadataPrefix=oai_dc 

Запросы POST

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

(Или $HTTP_RAW_POST_DATA ( docs ))

Запросы GET

 $input = $_SERVER['QUERY_STRING']; 

обработка
explode('&', $input) и поддерживать массив – $foundKeys – ключей (часть каждого элемента от explode() до символа = ). Если вы нажмете ключ, уже определенный в $foundKeys , выбросьте ошибку.

Для данных GET проверьте $_SERVER['QUERY_STRING'] . Но для данных POST вам нужно будет прочитать необработанные данные POST из потока php://input .

Так что-то вроде этого:

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

PHP $ _POST всегда будет устанавливать только одно значение для каждой переменной, если имя переменной запроса не заканчивается на [].

Если у вас нет контроля над передаваемыми переменными, вы можете попробовать использовать $ _SERVER ['RAW_HTTP_POST_DATA'], чтобы получить исходные данные запроса POST перед анализом, тогда вы можете использовать функцию parse_str () для синтаксического анализа этой строки.

Просто будьте осторожны, чтобы конфигурация PHP могла отключить установку значения RAW_HTTP_POST_DATA. В этом случае вы не можете ничего сделать, чтобы решить вашу проблему.

Не полностью надежный, но это может сработать

 $occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix='); 

Если вы ожидаете, что в конце значения будут иметь несколько значений с переменной с квадратными скобками. Таким образом вы получите массив для этой переменной. Если установлено несколько значений, массив будет иметь несколько записей.

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

$ _POST ['my_var'] будет массивом с «a» или «b», обоими или никакими в зависимости от используемых флажков.