php无限循环

san*_*ers 0 php recursion

这个函数给了我一个无限循环

function getCats($parent,$level){
    // retrieve all children of $parent
    $result = "";
    $query = "SELECT title,parent_id from t_cats where parent_id = '$parent'";

    if($rs = C_DB::fetchRecordset($query)){
        while($row = C_DB::fetchRow($rs)){
            $result .= str_repeat($parent,$level).$row['title']."\n";
            getCats($row['parent_id'],$level+1);
        }
    }

    return $result;
} 
Run Code Online (Sandbox Code Playgroud)

这是我的数据库表

CREATE TABLE  `db`.`t_cats` (
  `ID` int(10) unsigned NOT NULL auto_increment,
  `datasource_id` int(10) unsigned default '0',
  `version` char(10) character set latin1 default 'edit',
  `status` char(10) character set latin1 default 'new',
  `modified_date` datetime default NULL,
  `modified_by` int(10) unsigned default '0',
  `title` char(255) character set latin1 default NULL,
  `parent_id` int(11) default NULL,
  PRIMARY KEY  (`ID`),
  KEY `idx_datasource_id` (`datasource_id`)
) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)

我只是希望能够递归我的类别列表.

但是我做错了什么?


编辑:

function getCats($parent,$level){
                // retrieve all children of $parent
                $result ="";
                $query = "SELECT title,parent_id from t_cats where parent_id = '$parent'";
                if($rs = C_DB::fetchRecordset($query)){
                    while($row = C_DB::fetchRow($rs)){
                        $result.= str_repeat($parent,$level).$row['title']."\n";
                        getCats($row['id'],$level + 1   );
                    }
                }

                return $result;
    } 
Run Code Online (Sandbox Code Playgroud)

Gre*_*reg 5

这条线看起来错了:

getCats($row['parent_id'],$level+1);
Run Code Online (Sandbox Code Playgroud)

您应该使用当前子ID调用它 - 在您使用相同的ID一遍又一遍地调用它时.像这样的东西(你需要从你的表中选择id):

getCats($row['id'], $level + 1);
Run Code Online (Sandbox Code Playgroud)

编辑:您需要更新您的查询以选择id:

$query = "SELECT id, title, parent_id from t_cats where parent_id = '$parent' AND id != parent_id";
Run Code Online (Sandbox Code Playgroud)

如果一个项目是它自己的父项,我还添加了一点来阻止它进入循环.