Это может звучать странным, но в моем приложении 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'];
Обработка
разнесены ('&', $ input)
и поддерживать массив ключей - $ foundKeys
(часть каждого элемента из explode ()
перед символом =
). Если вы нажмете клавишу, уже определенную в $ foundKeys
, выдайте ошибку.
Если вы ожидаете, что несколько значений, переменная должна быть заключена в квадратные скобки в конце. Таким образом вы получите массив для этой переменной. Если установлено несколько значений, в массиве будет несколько записей.
<input type="checkbox" name="my_var[]" value="a">
<input type="checkbox" name="my_var[]" value="b">
$ _ POST ['my_var'] будет массивом с 'a' или 'b', с обоими или ни с одним, в зависимости от используемых флажков.
Для получения данных см. $ _ 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
Не совсем надежный, но это может сработать
$occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix=');
PHP $_POST всегда будет устанавливать только одно значение для переменной, если имя переменной запроса не заканчивается на [].
Если у вас нет контроля над отправляемыми переменными, вы можете попробовать использовать $_SERVER['RAW_HTTP_POST_DATA'] для получения исходных данных POST запроса до разбора, затем вы можете использовать функцию parse_str() для разбора этой строки.
Только будьте внимательны, возможно, в конфигурации PHP отключена установка значения RAW_HTTP_POST_DATA. В этом случае вы не сможете ничего сделать для решения вашей проблемы.