Заставьте метод php работать сам, пока не будет выполнено условие - PullRequest
0 голосов
/ 05 марта 2012

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

Теперь я хочу создать 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

Ответы [ 2 ]

0 голосов
/ 05 марта 2012

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

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

0 голосов
/ 05 марта 2012

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

return $this->getCatUrl($rij['ref'], $ur); // add the return!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...