PHP递归方法findparents3返回值为空 调用处获取结果为null问题排查
问题根因
递归场景下的返回值传递链路断裂,是导致最终接收到null的直接原因。
具体代码缺陷
在findparents3方法的回溯分支中,当查询tblrepobjects表未命中、继续查询tblobjects表获取到待回溯的父节点时,代码仅执行了递归调用,没有将递归获取的返回值沿调用栈向上传递:
// 原实现的错误片段 if ($studies2){ $this->findparents3($studies2[0]['objparent']); }
按照PHP的语法规则,函数执行过程中如果走到无return语句的分支,会默认返回null。这就导致:
- 递归链路最深处的节点哪怕通过查询拿到了正确的节点主键、最终标记值
"0",因为上一层调用没有把这个值返回给更外层,整个调用栈的返回值会逐层丢失 - 你观察到
findparents3内部输出正常,是因为各层递归的查询、逻辑判断流程都完整执行了,只是返回值没有顺着调用栈传导到最外层的调用方,最终在findobjtree方法里接收的$s自然为null
修复方式
仅需在递归调用位置补全return语句,让递归得到的返回值可以逐层向上传递:
// 修正后的回溯分支 if ($studies2){ return $this->findparents3($studies2[0]['objparent']); }
额外代码风险提示
当前findobjtree方法的查询实现存在两类隐患:
- 直接将
$callname字符串拼接进SQL语句,没有使用预处理参数绑定,存在SQL注入风险 - like子句中直接使用双引号包裹匹配值,在开启严格SQL模式的数据库环境下会触发语法错误
修正后的查询写法参考:
$sql = "SELECT * FROM tblobjects where callname like ?"; $stmt = $this->connect()->prepare($sql); $stmt->execute(["%{$callname}%"]);
内容的提问来源于stack exchange,提问作者srl
相关产品推荐
相关产品推荐

