PHP 变量赋值没有按预期工作

PHP Variable assignment does not work as expected

我正在尝试将 URL 中列出的参数分配到我的变量中。您可以在这里查看程序:

<?php

$browser;
$version;
$page;

foreach($_GET as $key => $value) {
  if (strcmp($key, "browser")) {
    $browser = $value;
  }
  elseif (strcmp($key, "version")) {
    $version = $value;
  }
  elseif (strcmp($key, "page")) {
    $page = $value;
  }
}

echo $browser;
echo $version;
echo $page;
?>

但不幸的是,它只打印出浏览器和版本。该页面没有出现。是的,page参数肯定写对了URL。如果我像这样更改代码,变量就会正确打印出来:

 <?php
    
    foreach($_GET as $key => $value) {
      if (strcmp($key, "browser")) {
        echo $value;
      }
      elseif (strcmp($key, "version")) {
        echo $value;
      }
      elseif (strcmp($key, "page")) {
        echo $value;
      }
    }
    ?>  

Link shematik: ./bglink/addstats.php?browser=Chrome&version=96&page=index
提前致谢。 菲利普

为什么不写这样的东西呢?

$browser = $_GET['browser'];
$version = $_GET['version'];
$page = $_GET['page'];

阅读 $_GET 的安全方法是使用 filter_input()

$browser = filter_input(INPUT_GET, 'browser');
$version = filter_input(INPUT_GET, 'version');
$page = filter_input(INPUT_GET, 'page');

https://www.php.net/manual/en/function.filter-input.php

但是对于原始问题,问题在于 (strcmp($key, "browser")) 应该是 (strcmp($key, "browser") == 0),其中 0 表示匹配。 但是,如果没有为 if() 指定条件,则 0 将读取 FALSE

strcmp 并不像你想的那样。

根据两个字符串的比较,可以return-1、0或1,而不是真或假。您的循环没有找到相等的字符串,它实际上会打印第一种情况 $key 等于您要询问的字符串,因为两者都是 -1和 1 将计算为真。

运行 带有一些额外调试输出的原始代码表明您实际上是在用循环中的其他元素覆盖变量:

Browser: my page
Version: my browser
Page: 

https://3v4l.org/QFSAl