我有一个包含三列的表:id
,ref
和catName
。每一行都包含一个可以作为子类别的类别;如果是,则ref
列引用主类别的id。当然,这种方法可以确保您可以创建多个子类别。
现在我想为包含其所有父母的catName
的每个类别创建一个网址。
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);
}
}
不知何故,这只会为顶级父级产生$ ur,而不会为子级产生$ 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 :(得分:0)
错误是你没有确保当递归停止时,结果“冒泡”调用堆栈,直到最后第一次调用函数返回给调用者。在代码中:
return $this->getCatUrl($rij['ref'], $ur); // add the return!
答案 1 :(得分:0)
你做错了。
我建议您查看闭包表[1] [2] [3],并阅读SQL Antipatterns书(第二章介绍树)。< / p>