You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP结合XML实现站点过滤时if条件判断异常的解决方法咨询

核心问题原因

  1. 逻辑运算符优先级错误
    PHP中&&的优先级高于||,原代码没有给分组条件加括号,导致实际运行的逻辑和预期完全不一致,这是过滤逻辑时灵时不灵的核心原因。比如A && B || C会被PHP自动解析为(A && B) || C,而非预期的A && (B || C)。
  2. SimpleXML节点类型问题
    simplexml_load_string返回的节点都是SimpleXMLElement对象,直接和POST的字符串/数值比较时,偶尔会出现隐式类型转换异常,最好显式把节点值转为对应类型再比较。
  3. 边界逻辑待确认
    原代码中$_POST['min_szerokosc'] <= $xml->min_szerokosc这类比对逻辑,需要自行核对是否符合业务预期:如果要求待过滤内容的尺寸在XML定义的区间内,标准写法应为待过滤尺寸 >= XML最小限制 且 待过滤尺寸 <= XML最大限制。

修复方案

调整if条件的括号分组,并且显式转换XML节点值,修改后代码如下:

<?php
$cat = new Kategoria;
$kat = [205,233,234,206,204,203,202];

// 预处理POST参数
foreach ($_POST as $k => $v) {
    $_POST[$k] = $v === "on" ? 1 : trim($v);
}

foreach ($kat as $b) {
    $result = $cat->getKategoria($b);
    foreach ($result as $res => $val) {
        if (preg_match("/tab_[0-9]{1,2}_filter/i", $res) > 0) {
            $xml = simplexml_load_string($val);
            if (!$xml) continue;

            // 显式转换XML节点值为对应类型,避免类型转换异常
            $xmlTyp = (string)$xml->typ;
            $xmlMinSzer = (int)$xml->min_szerokosc;
            $xmlMinWys = (int)$xml->min_wysokosc;
            $xmlMinGleb = (int)$xml->min_glebokosc;
            $xmlMaxSzer = (int)$xml->max_szerokosc;
            $xmlMaxWys = (int)$xml->max_wysokosc;
            $xmlMaxGleb = (int)$xml->max_glebokosc;
            $xmlMyjniaAuto = (int)$xml->myjnia_automat;
            $xmlKabinaAuto = (int)$xml->kabina_automat;
            $xmlTransportGorny = (int)$xml->transport_gorny;

            // 条件加括号明确分组,符合逻辑预期
            if (
                $_POST['typ'] === $xmlTyp
                && $_POST['min_szerokosc'] <= $xmlMinSzer
                && $_POST['min_wysokosc'] <= $xmlMinWys
                && $_POST['min_glebokosc'] <= $xmlMinGleb
                && $_POST['max_szerokosc'] <= $xmlMaxSzer
                && $_POST['max_wysokosc'] <= $xmlMaxWys
                && $_POST['max_glebokosc'] <= $xmlMaxGleb
                && (
                    $_POST['myjnia_automat'] == $xmlMyjniaAuto
                    || $_POST['myjnia_reczna'] == (int)$xml->myjnia_reczna
                    || $_POST['wanna'] == (int)$xml->wanna
                )
                && (
                    $_POST['kabina_automat'] == $xmlKabinaAuto
                    || $_POST['kabina_jedno_stanowiskowa'] == (int)$xml->kabina_jedno_stanowiskowa
                    || $_POST['kabina_dwu_stanowiskowa'] == (int)$xml->kabina_dwu_stanowiskowa
                )
                && (
                    $_POST['transport_gorny'] == $xmlTransportGorny
                    || $_POST['transport_dolny'] == (int)$xml->transport_dolny
                )
            ) {
                print "true:{$b}:{$res}\n";
            }
        }
    }
}
?>

额外优化建议

  • 提前判断POST参数是否存在,避免出现未定义索引的报错
  • 把过滤规则封装成单独的函数,避免代码冗余
  • 如果XML规则固定,可以提前把XML节点值转为数组存储,不需要每次重复转换

内容的提问来源于stack exchange,提问作者Sylwester Marć

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:27:03