Проверка вложенности страниц

rj45

Новичок
Есть база вида (сокращено)

PHP:
create table docs(
id int, //идентификатор страницы
link int, //строка для урла
parent int //идентификатор родительской, если нет то равно нулю
)
Документы запрашиваются через link, т.е. урл выглядит так:

/parentpage/otherpage/thispage

Как проверить правильность пути. Т.е. Как проверить что thispage.parent == otherpage.id && otherpage.parent == parentpage.id

...естественно вложенность может меняться.

Может я изначально неверно выбрал схему хранения иерархии страниц?
 

Фанат

oncle terrible
Команда форума
Да не, нормально. три запроса по очереди, проверяя полученный ранее парент
 
  • Like
Реакции: AmdY

rj45

Новичок
...вот не нравится мне этот вариант с множеством запросов ((( Это наверное паранойя да?
 

Фанат

oncle terrible
Команда форума
3 - это не множество.
и в любом деле важно не количество, а качество.
 

rj45

Новичок
А если сделать такую выборку

select id, parent, link from docs where link in (сегменты урл)

а потом пробежаться php? стоит ли овчина выделки или всё же смело через рекурсию и запросы к базе?
 

Фанат

oncle terrible
Команда форума
не вижу здесь никакой рекурсии - только обычный цикл.

если у разных парентов могут быть одинаковые дети, то в пхп ты замумукаешься их сортировать
 

rj45

Новичок
PHP:
for ($i = count($segs); $i > 0; $i--)
				{
					if ($segs[$i] == 'document')
					{
						if ($parent != 0)
						{
							$this->__wrong_path();
							return;
						}
					}
					else
					{
						$reply = $this->db->query('select id, parent from docs where link = ?', Array($segs[$i]));
						
						if ($reply->num_rows() == 0)
						{
							$this->__wrong_path();
							return;
						}
						
						$link = $reply->row();
						
						if ($parent && $link->id != $parent)
						{
							$this->__wrong_path();
							return;
						}
						
						$parent = $link->parent;
					}
				}
Достаточно не через спину?
 

Фанат

oncle terrible
Команда форума
Не понимаю, зачем так длинно
почему нельзя сделать что-то вроде
PHP:
$parent=0;
foreach ($segs as $seg) {
  $row = $this->db->row('select id, parent from docs where link = ? AND parent= ?', $seg,$parent);
  if (!$row  ) {
    $this->__wrong_path();
  }
  $parent=$row['id'];
}
extract($row);
 

rj45

Новичок
Ах да, простите.

$serg = explode('/', 'parentpage/otherpage/thispage');

в нём нет информации о $parent
 

Фанат

oncle terrible
Команда форума
но мы ведь по умолчанию принимаем, что у первой страницы парент = 0?
 

rj45

Новичок
Ну тут просто момент такой. Страница в корне иерархии имеет parent = 0 и если мы добрались до document то значит мы уже в корне. Ну тут ещё специфика построения URL, document - это название файла скрипта в котором этот код, но оно тоже попадает в URL и его можно использовать как метку того что мы подошли к концу урла, т.е. документа с link = document в базе нет... а вот если будут, то возникнут проблемы ) Но поскольку сайт мой то такой ссылки так не будет )))
 

rj45

Новичок
Хотя проверил. Даже если в базе есть такая линка то скрип всё равно делает всё как надо.
 
Сверху