PHP: Как проверить, содержат ли строка запроса или переменные POST один и тот же var дважды - PullRequest
5 голосов
/ 09 апреля 2010

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

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

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

Пример

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

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc

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

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

verb=ListIdentifiers&metadataPrefix=oai_dc

Ответы [ 5 ]

10 голосов
/ 09 апреля 2010

POST-запросов

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

(или $HTTP_RAW_POST_DATA ( документы ))

GET Requests

$input = $_SERVER['QUERY_STRING'];

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

2 голосов
/ 09 апреля 2010

Для получения данных 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
0 голосов
/ 09 апреля 2010

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

$occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix=');
0 голосов
/ 09 апреля 2010

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

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

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

0 голосов
/ 09 апреля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...