PHP:如何检查查询字符串或POST变量是否包含两次相同的变量

时间:2010-04-09 06:14:22

标签: php post get query-string

这可能听起来很奇怪,但在我的PHP应用程序中,我需要检查在查询字符串或POST变量中是否多次声明了相同的变量名,并在这种情况下返回错误值。如果我的应用程序在这种情况下没有返回错误,则无法进行合规性检查。

使用$ _GET,$ _POST等访问变量时,PHP仅返回为每个变量名称指定的最后一个值。我无法找到一种方法来判断任何变量是否出现过多次。

我只需要查明查询字符串或POST正文中的变量是否包含多次相同的变量名,无论值是什么。

示例

我的应用程序应该为此查询字符串返回错误:

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc

请注意,“metadataPrefix”定义了两次。

我的应用程序不应该为此查询字符串返回错误:

verb=ListIdentifiers&metadataPrefix=oai_dc

5 个答案:

答案 0 :(得分:10)

POST请求

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

(或$HTTP_RAW_POST_DATAdocs))

获取请求

$input = $_SERVER['QUERY_STRING'];

<强>处理
explode('&', $input)并维护一个数组 - $foundKeys - 键(explode()字符前=中每个项目的一部分)。如果您点击了$foundKeys中已定义的密钥,则抛出错误。

答案 1 :(得分:2)

对于GET数据,请查看$_SERVER['QUERY_STRING']。但对于POST数据,您需要从php://input流中读取原始POST数据。

这样的事情:

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

答案 2 :(得分:0)

除非请求变量名以[]结尾,否则PHP $ _POST将始终只为每个变量设置一个值。

如果您无法控制发送的变量,您可以尝试使用$ _SERVER ['RAW_HTTP_POST_DATA']在解析之前获取原始POST请求数据,然后您可以使用parse_str()函数来解析该字符串。

请注意,PHP配置可能已禁用设置RAW_HTTP_POST_DATA值。在这种情况下,你无法解决问题。

答案 3 :(得分:0)

并非完全万无一失,但这可能有效

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

答案 4 :(得分:-1)

如果您期望多个值在最后用方括号命名变量。这样您就可以获得该变量的数组。如果设置了多个值,则该数组将具有多个条目。

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

$ _ POST ['my_var']将是一个带有'a'或'b'的数组,两者都没有,或者根据使用的复选框没有。