这可能听起来很奇怪,但在我的PHP应用程序中,我需要检查在查询字符串或POST变量中是否多次声明了相同的变量名,并在这种情况下返回错误值。如果我的应用程序在这种情况下没有返回错误,则无法进行合规性检查。
使用$ _GET,$ _POST等访问变量时,PHP仅返回为每个变量名称指定的最后一个值。我无法找到一种方法来判断任何变量是否出现过多次。
我只需要查明查询字符串或POST正文中的变量是否包含多次相同的变量名,无论值是什么。
示例
我的应用程序应该为此查询字符串返回错误:
verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc
请注意,“metadataPrefix”定义了两次。
我的应用程序不应该为此查询字符串返回错误:
verb=ListIdentifiers&metadataPrefix=oai_dc
答案 0 :(得分:10)
POST请求
$input = file_get_contents('php://input');
(或$HTTP_RAW_POST_DATA
(docs))
获取请求
$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)
如果您无法控制发送的变量,您可以尝试使用$ _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'的数组,两者都没有,或者根据使用的复选框没有。