$ _GET变量与空字符串值一起传递

时间:2018-05-22 21:50:38

标签: php get

我有我的本地测试服务器和正在运行的服务器。在测试服务器上,我使用此URL:

http://localhost/?&start[]=0&duration_[]=2&name[]=David&setting[]=26&start[]=6&duration[]=18&name[]=john&setting[]=26

从这个URL,我使用for循环来运行数组:

$num = count($_GET['start']);
if (isset($_GET['start']) && count($_GET['start']))
{
    for($i=0;$i<$num;$i++)
    {
        echo "Time: " . intval(trim($_GET['start'][$i]));
    }
}

这就像一个魅力。但是,当我在我的实际服务器上运行它时,我将所有变量作为空字符串返回...这是var_dump:

 ["start"]=>
  string(0) ""
  ["duration"]=>
  string(0) ""
  ["name"]=>
  string(0) ""
  ["setting"]=>
  string(0) ""

任何人都知道这里发生了什么?我从上面提出了相同的for-loop测试代码,我显然没有得到任何其他内容:&#34;时间:&#34;

2 个答案:

答案 0 :(得分:0)

问题不在于代码或$ _GET方法或服务器的差异(稍有不同)。我没有意识到当我在主服务器上使用filter_var()时,我的数组被转换为字符串。导致问题的这一部分清理代码不在我的测试服务器上。根据{{​​3}}:

  

要过滤的值。请注意,标量值在过滤之前会在内部转换为字符串。

这是我第一次使用$ _GET变量的数组功能创建函数,所以我没有意识到在清理时,我正在清理每个GET变量,在这个新实例中,我正在清理每个GET数组,而不是GET值。

我使用的代码是:

$get_arr = $var_arr['_GET'];
$get_key = array_keys($get_arr);
$_GET[$get_key[$g_a]] = trim(filter_var($_GET[$get_key[$g_a]], FILTER_SANITIZE_SPECIAL_CHARS));

我将其更改为

的代码
$get_arr = $var_arr['_GET'];
$get_key = array_keys($get_arr);
$_GET[$get_key[$k]][$i] = trim(filter_var($_GET[$get_key[$k]][$i], FILTER_SANITIZE_SPECIAL_CHARS));

这只是一个细微的区别,但足以让我调试这几天。希望这可以帮助其他人。

答案 1 :(得分:-2)

删除你的vars后的[]。

http://localhost/?start=0 

而不是

http://localhost/?start[]=0

你传递[]作为你的字符串,所以它吐出来,删除[]。