2012-03-05 5 views
0

У меня есть таблица с тремя столбцами: id, ref и catName. Каждая строка содержит категорию, которая может быть подкатегорией; если это так, то столбец ref ссылается на идентификатор основной категории. Вне курса этот метод гарантирует, что вы можете создать множество подкатегорий.Сделать метод php запуститься до тех пор, пока не будет выполнено условие

Теперь я хочу сделать URL-адрес для каждой категории, содержащей 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 для верхнего родителя, а не для детей. Что я делаю неправильно?

Пример из базы данных:

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

ответ

0

Вы делаете это неправильно.

Я рекомендую вам посмотреть в таблицах Закрытие [1][2][3], а также читать SQL Antipatterns книгу (она охватывает деревья во второй главе).

0

Ошибка в том, что вы не убедитесь, что, когда рекурсия останавливается, результаты «пузыриться» стек вызовов, пока, наконец, первый вызов функции не возвращается вызывающего абонента. Код:

return $this->getCatUrl($rij['ref'], $ur); // add the return! 
Смежные вопросы