在 else 分支中包含松散比较的三元表达式会产生意外结果

Ternary expression containing loose comparison in else branch yields unexpected result

有人可以帮我处理这段代码吗?在我的网站上,没有结果。

<?php
if (isset($_GET['id']) ? $product['valid2'] : ''==1) {
    echo "Yes";
} elseif (isset($_GET['id']) ? $product['valid2'] : ''==0) {
    echo "No";
}

根据您的评论,您似乎只想检查 id 是否已设置或未分配给 0。

这可以通过简单检查它是否存在然后将值转换为布尔值来实现。这会将 > 0 的值分配给 true,0 分配给 false。

$id = filter_input(INPUT_GET, 'id');
$idIsSet = (bool) $id;

if (!$idIsSet) {
    // Id is not set so do something to handle this.
    echo "No";
    die();
}

// The Id is set so you can do whatever you want with the Id.
echo "Yes";

我用这个函数解决了它:

<?php
          
$v2 = isset($_GET['id']) ? $product['valid2'] : '';          
 
          
if ($v2==1) {
    echo "Yes";
} elseif ($v2==0) {
    echo "No";
}

?> 

感谢大家的回答!

根据php中的Operator Precedence规则(可以在不同的php版本之间改变),松散的“比较”(==)享有比“三元”(? :).

这意味着在 isset() 检查之前计算松散比较部分。

同样重要的是要表达从 php8 ''==0 计算为 false,而在 php8 以下的版本中相同的表达式计算为 true.资源:https://www.php.net/manual/en/migration80.incompatible.php

归结起来,您的 ifelseif 表达式正在执行 truthy/falsey 检查。

  1. 如前所述,首先执行三元表达式的松散比较分支。
  2. 如果isset($_GET['id'])为真,$product['valid2']的值被计算为truthy/falsey。
  3. 如果isset($_GET['id'])为假,松散比较的值被评估为truthy/falsey。

在不熟悉你的项目的情况下,用下面的方式表达逻辑可能是直接的、正确的、可读的。

echo isset($_GET['id']) && $product['valid2'] == 1 ? 'Yes' : 'No';

这并不是为了复制您的代码逻辑,而是为了改进它并确保您始终收到 yes/no 结果。