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

Posted

技术标签:

【中文标题】PHP 变量赋值没有按预期工作【英文标题】:PHP Variable assignment does not work as expected 【发布时间】:2022-01-18 18:41:13 【问题描述】:

我正在尝试将 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;
?>

但不幸的是,它只打印出浏览器和版本。页面不出现。是的,页面参数绝对正确地写在了 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;
      
    
    ?>  

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

【问题讨论】:

在这种情况下,假设您的代码所在的文件中有一个小损坏。删除整个 foreach 循环并重写它。这听起来不太可能,但这不是我第一次发生这种情况。 【参考方案1】:

strcmp 并没有按照你的想法去做。

它可以根据两个字符串的比较返回-1、0或1,而不是true或false。您的循环没有找到相等的字符串,它实际上会打印第一种情况,其中 $key 等于您询问的字符串,因为 -1 和 1 都将评估为真的。

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

Browser: my page
Version: my browser
Page: 

见https://3v4l.org/QFSAl

【讨论】:

【参考方案2】:

阅读$_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

【讨论】:

【参考方案3】:

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

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

【讨论】:

是的,我将在生产中使用它。已经插入了。我刚想出了这段代码,非常想知道这个 sn-p 有什么问题。我对不需要的代码非常感兴趣,因此我试图找出解决方案。 直接访问$_GET 存在安全风险 @chaos505 好的。谢谢

以上是关于PHP 变量赋值没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

php的关于字符串类型的变量的赋值问题,谢谢

值的条件赋值 - ifelse() 当条件和预期的返回值没有相同的特征时是最好的吗? [R]

php中smarty怎么赋值变量到模板

详解PHP变量传值赋值和引用赋值变量销毁

被遗忘的赋值运算符“=”和常见的“:=”

php如何赋值