Это может показаться странным, но в моем приложении 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», обоими или никакими в зависимости от используемых флажков.