Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何检查查询字符串或POST变量是否包含相同的变量两次_Php_Post_Get_Query String - Fatal编程技术网

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

PHP:如何检查查询字符串或POST变量是否包含相同的变量两次,php,post,get,query-string,Php,Post,Get,Query String,这听起来可能很奇怪,但在我的PHP应用程序中,我需要检查同一个变量名是否在查询字符串或POST变量中声明了多次,如果是这种情况,则返回一个错误值。如果我的应用程序在这种情况下没有返回错误,那么它将无法通过符合性检查 当使用$\u GET、$\u POST等访问变量时,PHP只返回为每个变量名给定的最后一个值。我找不到一种方法来判断是否有任何变量出现了不止一次 我只需要找出查询字符串或POST正文中的变量是否多次包含相同的变量名,不管值是什么 示例 我的应用程序应该为此查询字符串返回一个错误: v

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

当使用$\u GET、$\u POST等访问变量时,PHP只返回为每个变量名给定的最后一个值。我找不到一种方法来判断是否有任何变量出现了不止一次

我只需要找出查询字符串或POST正文中的变量是否多次包含相同的变量名,不管值是什么

示例

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

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)来获取“=”符号之前的部分