PHP动态类别功能cont不起作用



im在一个具有类别,子类别,子类别类别等项目上工作。用户可以创建它们。我想在桌子上显示它们。我使用此功能,但是回报仅给我父母类别(parent_id = 0)。它错过了子类别,子类别...如果我放了一个var_dump,它向我表明了串联正在起作用,但是当该函数找到另一个类别父时,会丢失其他数据。我做错了什么,请帮忙。

我想返回一个包含所有类别和子类别的变量。

function categoryTree($catsSubcats = "", $parent_id = 0, $sub_mark = ""){ var_dump($catsSubcats);
        $stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = $parent_id");
        $stmt -> execute();
        $respuesta = $stmt -> fetchAll(); 
        if($respuesta){
            foreach($respuesta as $key => $value){
                $catsSubcats = $catsSubcats . $sub_mark.$value['nombre'].'<br>'; 
                categoryTree($catsSubcats, $value['id'], $sub_mark.str_repeat('&nbsp;', 5));
            }
            return $catsSubcats;
        }
    }

主要问题是不使用递归调用的结果,但是如果您将其附加到字符串,则您最终会重复很多。

我认为您不需要将主字符串传递给递归电话。这就是导致重复结果的原因。您只需要附加递归调用的结果,而不是当时的结果加上您已经拥有的所有内容。

另外,如果您递归地通过准备好的语句,则应该能够重复使用它,而不是反复准备同一件事。

我无法真正测试它,但我认为这会更好。

function categoryTree($parent_id = 0, $sub_mark = "", $stmt = null) {
    if (!$stmt) {
        // only prepare the first time, then pass the prepared statement to subsequent calls
        $stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = ?");
    }
    // bind $parent_id to the ? placeholder in the prepared statement
    $stmt->execute([$parent_id]);
    $respuesta = $stmt->fetchAll();
    // initialize the result of each call to an empty string
    $catsSubcats = "";
    if ($respuesta) {
        // you can also move this before the loop so it only has to execute once
        $sub_mark .= str_repeat('&nbsp;', 5);
        foreach ($respuesta as $key => $value) {
            $catsSubcats .= $sub_mark.$value['nombre'].'<br>';
            $catsSubcats .= categoryTree($value['id'], $sub_mark, $stmt);
        }
    }
    // always return a string
    return $catsSubcats;
}

您没有使用递归中的返回值。可能您想要这样的东西:

function categoryTree($parent_id = 0, $sub_mark = ""){ 
        $catsSubcats='';
        $stmt = Conexion::conectar()->prepare("SELECT * FROM categorias_compra WHERE parent_id = $parent_id");
        $stmt -> execute();
        $respuesta = $stmt -> fetchAll(); 
        if($respuesta){
            foreach($respuesta as $key => $value){
                $catsSubcats .= $sub_mark.$value['nombre'].'<br>'; 
                $catsSubcats .= categoryTree($value['id'], $sub_mark.str_repeat('&nbsp;', 5));
            }
        }
        return $catsSubcats;
    }

最新更新