2012-03-05 48 views
0

我有一个三列的表:id,refcatName。每行包含一个可以是子类别的类别;如果是这样的话,那么ref列的引用就是主类别的id。当然,这个方法确保你可以创建许多子类别。让一个php方法运行自己,直到满足条件

现在我想为每个包含所有父母的catName的类别创建一个url。

private function getCatUrl($cat, $ur = array()){ 
     $sql = "SELECT * FROM shop_cat WHERE id = :id LIMIT 1"; 
     $st = $this->db->prepare($sql); 
     $st->bindParam('id', $cat, PDO::PARAM_INT); 
     $st->execute(); 

     $rij = $st->Fetch(); 
     $ur[] = urlencode($rij['naam']); 

     if($rij['ref'] == 0){ 
      //Done, I've reached the top parent; 
      return implode('/',$ur); 

     }else{ 
      //there is a parent/reference above this level 
      //getting there 
      $this->getCatUrl($rij['ref'], $ur); 

     } 

    } 

不知何故,这只会产生一个$顶级父母而不是孩子。 我在做什么错?

样本数据库:

id ref catName 
1 0 GroundFloor 
4 1 Portal 
5 1 Stairs 

2 0 FirstFloor 
6 2 DiningArea 
12 6 Chair 
7 2 Toilet 
9 2 SittingRoom 
10 9 Couch 
11 9 Dresser 

3 0 Roof 
8 3 LoungeChair 
+0

您能否包含来自数据库的数据示例。还有一个例子说明你如何调用这个函数(即什么参数) – ManseUK 2012-03-05 13:55:38

回答

0

你做错了。

我会建议为你寻找到关闭表[1][2][3],并且也可以参考SQL Antipatterns书(它涵盖了树木第二章)。

0

的错误是,你不确保递归停止时,结果“冒泡”调用堆栈,直到最后的函数的第一次调用返回呼叫者,召集者。代码:

return $this->getCatUrl($rij['ref'], $ur); // add the return! 
相关问题