Генерация ссылок на связаные таблицы

freel

Новичок
Генерация ссылок на связаные таблицы

Доброго!
возник вопрос по генерации страницы в которой принимают участие
две таблицы
1) Темы
2) Страницы

даный вывод осуществляю так

PHP:
$theme = "algoritms_t";
$page = "algoritms_p";
    
   $t_query= "SELECT * FROM $theme"; //выбрать все темы
   $t_res = create_page($t_query); //выполнить запрос
   while($t_row=mysql_fetch_assoc($t_res)) //идём по массиву
   {

      $them_id = $t_row['id']; //определим номер темы
      $them_name = $t_row['name']; //определим имя темы
      echo "<br><h3>$them_name</h3>"; 

    $p_query= "SELECT * FROM `$page` WHERE `$page`.`id`= $them_id"; //запрос статей 
    $p_res = create_page($p_query); //выполнить запрос

             while($p_row=mysql_fetch_assoc($p_res)) //вывод статей темы
             {
                 $page_id = $p_row['id'];
                 $page_name = $p_row['name'];
                 echo "<br> <a href=\"?theme=$them_id,page=$page_name\">$page_name</a>";
             }    

   }
в результате получаю два вложеных цикла, возможно ли оптимизировать даную ф-цию, сделать её более читабельной и практичной?
 

Фанат

oncle terrible
Команда форума
можно сделать одним запросом.
как ты и делал в своем прошлом вопросе, если мне не изменяет память
 

freel

Новичок
так не получится, ибо таблиц уже 3, структура их такова

Разделы:
id //auto_increment
name

Темы:
id //auto_increment
id_part //к какому номеру таблицы "Разделы:" имеет принадлежность -
name

Страницы:
id //auto_icriment
-
id_them - к какому номеру таблицы "Темы:" темы пренадлежит -
name
data

передаю с браузера
1) номер раздела
2) номер темы
3) номер страницы


класс "страница"
содержит методы:

/*Метод принимает id и возвращает полную инфу по id данной части
*/
function print_part($id_part)
{
$query= "SELECT * FROM `part` WHERE `part`.`id`= $id_part"; //запрос части
$res = $this->exect_query($query);

return $res;
}

/*Метод принимает id темы и возвращает массив тем с указаным id/
*/
function print_them($id_them)
{
$query= "SELECT * FROM `them` WHERE `them`.`id_part`= $id_them"; //запрос темы
$res = $this->exect_query($query);

return $res;
}


/*Метод принимает id страницы и возвращает массив страниц с указаным id
*/
function print_page($id_page)
{
$query= "SELECT * FROM `page` WHERE `page`.`id_them`= $id_page"; //запрос страниц
$res = $this->exect_query($query);
return $res;
}

в самом же index.php от вложеного цикла уйти не получилось, проходя по массиву тем, приходится каждый раз вызывать function print_page($id_page) передавая в качестве $id_page номер текущей темы

index.php:

$page_obj = new class_page(); //создать объект страничка
$res = $page_obj->print_part($id_part); //вывoд раздела
foreach ($res as $row)
{
echo "<h3> $row[name] </h3>";
}

$res = $page_obj->print_them($id_them); //вывод темы
foreach ($res as $row) //идём циклом по темам
{
echo "<br>them = $row[id]-$row[name]";

$res = $page_obj->print_page($row[id]); //вывод страниц по теме
foreach ($res as $row)//идём циклом по страницам
{
echo "<br>-----$row[name]";
}


}


что бы посоветовали со своего опыта? заранее спасибо.
 

Фанат

oncle terrible
Команда форума
я бы посоветовал пользоваться тегом [/php] при оформлении кода
очень трудно читать.
 

freel

Новичок
PHP:
/*Метод принимает id и возвращает полную инфу по id данной части 
*/
function print_part($id_part)
{
$query= "SELECT * FROM `part` WHERE `part`.`id`= $id_part"; //запрос части
$res = $this->exect_query($query);

return $res; 
}

/*Метод принимает id темы и возвращает массив тем с указаным id/
*/
function print_them($id_them)
{
$query= "SELECT * FROM `them` WHERE `them`.`id_part`= $id_them"; //запрос темы 
$res = $this->exect_query($query);

return $res; 
}


/*Метод принимает id страницы и возвращает массив страниц с указаным id
*/
function print_page($id_page)
{
$query= "SELECT * FROM `page` WHERE `page`.`id_them`= $id_page"; //запрос страниц
$res = $this->exect_query($query);
return $res; 
}
в самом же index.php от вложеного цикла уйти не получилось, проходя по массиву тем, приходится каждый раз вызывать function print_page($id_page) передавая в качестве $id_page номер текущей темы

index.php:
PHP:
$page_obj = new class_page(); //создать объект страничка
$res = $page_obj->print_part($id_part); //вывoд раздела
foreach ($res as $row) {
  echo "<h3> $row[name] </h3>";
}

$res = $page_obj->print_them($id_them); //вывод темы
foreach ($res as $row) {//идём циклом по темам 
  echo "<br>them = $row[id]-$row[name]";
  $res = $page_obj->print_page($row[id]); //вывод страниц по теме
  foreach ($res as $row) {//идём циклом по страницам
    echo "<br>-----$row[name]";
  }
}
 

Фанат

oncle terrible
Команда форума
мы бы посоветовали сделать одним запросом.
как ты и делал в своем прошлом вопросе, если мне не изменяет память
 

freel

Новичок
к сожалени одним запросом не получится, таблиц стало 3, и приходится чередовать темы и страницы во время вывода (
 

Фанат

oncle terrible
Команда форума
что значит "чередовать темы и страницы"? если ты думаешь, что кто-нибудь понимает, что ты называешь этими терминами, и полагаешь, что кто-нибудь знает, что ты в результате хочешь получить, то ты ошибаешься.
 

freel

Новичок
Буду точнее в высказываниях.
чередовать темы и страницы - значит выводить из таблицы "тема" в браузер тему подно номером 1, под ней страницы даной темы, затем тему под номером 2 итд

PHP:
 $res_them = $page_obj->print_them($id_them); //вывод темы
   foreach ($res_them as $row_them) //идём циклом по темам
   {
         
      include "usr/link/link_them.inc"; //вывод темы

      $res_page = $page_obj->print_page($row_them[id]); //вывод страниц по теме
      foreach ($res_page as $row_page)//идём циклом по страницам
      {
         include "usr/link/link_page.inc"; //вывод страницы
      }

   
   }
возможно я не так подхожу к созданию полей таблиц и связи их между собой, для решения этой конкретной задачи, вот и хочу узнать как вы решаете такую задачу.
 

Фанат

oncle terrible
Команда форума
теоретически, все три таблицы можно объединить в одном запросе.
 
Сверху