代码之家  ›  专栏  ›  技术社区  ›  thomasrutter

php:如何检查查询字符串或后var是否包含相同的var两次

  •  5
  • thomasrutter  · 技术社区  · 14 年前

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

    当使用$\u get、$\u post等访问var时,php只返回为每个变量名给定的最后一个值。我找不到一种方法来判断任何变量是否出现过一次以上。

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

    例子

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

    verb=ListIdentifiers&metadataPrefix=oai_dc&metadataPrefix=oai_dc
    

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

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

    verb=ListIdentifiers&metadataPrefix=oai_dc
    
    5 回复  |  直到 8 年前
        1
  •  10
  •   jensgram    14 年前

    发布请求

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

    (或) $HTTP_RAW_POST_DATA ( docs )

    获取请求

    $input = $_SERVER['QUERY_STRING'];
    

    处理
    explode('&', $input) 并保持一个阵列- $foundKeys -键(每个项的一部分 explode() = 字符)。如果你点击一个已经在 $foundkeys美元 ,抛出错误。

        2
  •  2
  •   Rémi F    8 年前

    获取数据,请查看 $_SERVER['QUERY_STRING'] . 但是对于post数据,您需要从 php://input 流。

    所以像这样:

    // 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
  •  0
  •   mlemos    14 年前

    php$\u post将始终只为每个变量设置一个值,除非请求变量名以[]结尾。

    如果对发送的变量没有控制权,可以尝试在解析前使用$_server['raw_http_post_data']获取原始的post请求数据,然后使用parse_str()函数来解析该字符串。

    请注意,PHP配置可能已禁用设置原始\u http \u post \u数据值。在这种情况下,你不能做任何事情来解决你的问题。

        4
  •  0
  •   ChrisR    14 年前

    不完全是万无一失,但这可能奏效。

    $occurrences = substr_count($_SERVER['QUERY_STRING'], 'metadataPrefix=');
    
        5
  •  -1
  •   mlemos    14 年前

    如果需要多个名为变量的值,并在末尾加上方括号。这样就可以得到该变量的数组。如果设置了多个值,数组将有多个条目。

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

    $_post['my_var']将是一个数组,根据所使用的复选框,数组中要么有“a”要么有“b”,要么两者都有,要么没有。