【问题标题】:PHP: How to check if query string or POST vars contain same var twicePHP:如何检查查询字符串或 POST 变量是否包含相同的变量两次
【发布时间】:2011-02-06 00:26:59
【问题描述】:

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

当使用 $_GET、$_POST 等访问变量时,PHP 只返回每个变量名的最后一个值。我找不到方法来判断任何变量是否多次出现。

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

示例

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

verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc

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

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

verb=ListIdentifiers&metadataPrefix=oai_dc

【问题讨论】:

  • 我开始思考“正则表达式”。嗯不知道我会怎么做。

标签: php post get query-string


【解决方案1】:

POST 请求

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

(或$HTTP_RAW_POST_DATAdocs))

GET 请求

$input = $_SERVER['QUERY_STRING'];

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

【讨论】:

  • 关于“处理”部分:如果您事先知道可能重复的参数 - 比如说:“metadataPrefix” - 您可以在每个 @987654330 开头的“metadataPrefix =”上查找多个匹配项@'ed 项目。
  • ... 或使用@Christopher Nadeau 的回答中提出的substr_count(),首先不需要explode() :)
  • 然后在数组中的每个值上,您可以使用 list($name) = explode('=', $thisval) 获取“=”符号之前的部分
【解决方案2】:

要获取数据,请查看$_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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果您期望多个值以方括号结尾的变量命名。通过这种方式,您可以获得该变量的数组。如果设置了多个值,则数组将有多个条目。

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

        $_POST['my_var'] 将是一个包含 'a' 或 'b' 的数组,或者两者都有,或者都没有,具体取决于所使用的复选框。

        【讨论】:

          猜你喜欢
          • 2016-12-06
          • 1970-01-01
          • 2016-10-03
          • 2018-06-14
          • 2013-07-01
          • 2018-04-23
          • 2013-08-22
          • 2021-06-27
          • 2023-03-12
          相关资源
          最近更新 更多