PHP:如何检查查询字符串或POST变量是否包含相同的变量两次
这听起来可能很奇怪,但在我的PHP应用程序中,我需要检查同一个变量名是否在查询字符串或POST变量中声明了多次,如果是这种情况,则返回一个错误值。如果我的应用程序在这种情况下没有返回错误,那么它将无法通过符合性检查 当使用$\u GET、$\u POST等访问变量时,PHP只返回为每个变量名给定的最后一个值。我找不到一种方法来判断是否有任何变量出现了不止一次 我只需要找出查询字符串或POST正文中的变量是否多次包含相同的变量名,不管值是什么 示例 我的应用程序应该为此查询字符串返回一个错误:PHP:如何检查查询字符串或POST变量是否包含相同的变量两次,php,post,get,query-string,Php,Post,Get,Query String,这听起来可能很奇怪,但在我的PHP应用程序中,我需要检查同一个变量名是否在查询字符串或POST变量中声明了多次,如果是这种情况,则返回一个错误值。如果我的应用程序在这种情况下没有返回错误,那么它将无法通过符合性检查 当使用$\u GET、$\u POST等访问变量时,PHP只返回为每个变量名给定的最后一个值。我找不到一种方法来判断是否有任何变量出现了不止一次 我只需要找出查询字符串或POST正文中的变量是否多次包含相同的变量名,不管值是什么 示例 我的应用程序应该为此查询字符串返回一个错误: v
verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc
verb=ListIdentifiers&metadataPrefix=oai_dc
请注意,“metadataPrefix”定义了两次
我的应用程序不应为此查询字符串返回错误:
verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc
verb=ListIdentifiers&metadataPrefix=oai_dc
如果希望有多个值,请在末尾使用方括号命名变量。这样就可以得到该变量的数组。如果设置了多个值,数组将有多个条目
<input type="checkbox" name="my_var[]" value="a">
<input type="checkbox" name="my_var[]" value="b">
$\u POST['my\u var']将是一个包含'a'或'b'的数组,两者都有,或者都没有,具体取决于所使用的复选框。POST Requests
$input = file_get_contents('php://input');
$input = $_SERVER['QUERY_STRING'];
(或$HTTP\u原始\u发布数据
())
获取请求
$input = file_get_contents('php://input');
$input = $_SERVER['QUERY_STRING'];
处理分解('&',$input)
并维护一个数组-$foundKeys
-键(位于=
字符前面的分解()
中的每个项的部分)。如果您点击了已在$foundKeys
中定义的键,则抛出错误。要获取数据,请签出。但是对于POST数据,您需要从流中读取原始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
除非请求变量名以[]结尾,否则PHP$\u POST将始终仅为每个变量设置一个值 如果无法控制发送的变量,则可以尝试在解析之前使用$\u服务器['RAW\u HTTP\u POST\u DATA']获取原始POST请求数据,然后可以使用parse\u str()函数解析该字符串
请注意,PHP配置可能已禁用设置原始\u HTTP\u POST\u数据值。在这种情况下,您无法做任何事情来解决您的问题。并非完全万无一失,但这可能会奏效
$occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix=');
我开始思考“正则表达式”。嗯,不知道我会怎么做。关于“处理”部分:如果你事先知道可能重复的参数,比如说:“metadataPrefix”-你可以在每个
explode()。。。。或者按照@Christopher Nadeau的回答中的建议使用substr\u count()
,首先不需要explode()
),然后在数组中的每个值上可以使用list($name)=explode('=',$thisval)来获取“=”符号之前的部分