php - 通过导航循环将子页面拉入正确的主题

php - looping through a navigation to pull sub pages into the right subject

我有一个包含两个 table 的数据库。

我希望显示导航,以便获得具有相应主题的正确页面。

*subject 1
   - page 1
   - page 2
*subject 2
   - page 1

我的页面有相同的 ID,将它们连接到它们的主题。例如,我将其命名为 'page_link' 或 'subject_link'

*subject 1 (has a subject_link of 1)
  -page 1 (has a page_link of 1)

到目前为止,我的代码列出了主题 1 和其中的所有子页面。然后它列出了下一个主题,但没有列出它的子页面。

这是为什么?

<?php

// writing the query - selecting subject name
$subject_name_query = "SELECT id, subject_name, subject_link FROM subjects";
$subject_name_result = mysqli_query($connection, $subject_name_query);

// writing the query - selecting page
$page_name_query = "SELECT id, page_name, page_link FROM pages";
$page_name_result = mysqli_query($connection, $page_name_query);

?>

<ul>

    <?php

        while($subject_name = mysqli_fetch_assoc($subject_name_result)) {
            echo '<li><a href="?subject=' . $subject_name['id'] . '">' . $subject_name['subject_name'] . '</a>';

            while($page_name = mysqli_fetch_assoc($page_name_result)) {
                if($page_name['page_link'] == $subject_name['subject_link']) {
                    echo '<ul><li><a href="?page=' . $page_name['id'] . '">' . $page_name['page_name'] . '</a></li></ul>';
                }
            }
            echo '</li>';           
        }    
    ?>    
</ul>
<?php
    // writing the query - selecting subject name
    $subject_query = "SELECT id, subject_name, subject_link FROM subjects";
    $subject_result = mysqli_query($connection, $subject_query);

    // writing the query - selecting page
    $page_query = "SELECT id, page_name, page_link FROM pages";
    $page_result = mysqli_query($connection, $page_query);

    function fetch_as_array($result){
      $array = array();

      while($row = mysqli_fetch_assoc($result)){
        array_push($array, $row);
      }

      return $array;
    }

    $subject_array = fetch_as_array($subject_result);
    $page_array = fetch_as_array($page_result);

    foreach($subject_array as $subject){

      echo '<li><a href="?subject=' . $subject['id'] . '">' . $subject['subject_name'] . '</a>';

      foreach($page_array as $page){

        if($page['page_link'] == $subject['subject_link']){

          echo '<ul><li><a href="?page=' . $page['id'] . '">' . $page['page_name'] . '</a></li></ul>';
        }

      }

      echo '</li>';
    }
?>

这应该可以解决问题。

但是在 PHP 中添加标记太可怕了。我会使用像 Jade 或 Mustache 这样的模板语言,这取决于你想如何编写它。例如,对于您的情况,您可以这样做:

subjects.php

<?php

// THIS IS ALL THE SAME

// writing the query - selecting subject name
$subject_query = "SELECT id, subject_name, subject_link FROM subjects";
$subject_result = mysqli_query($connection, $subject_query);

// writing the query - selecting page
$page_query = "SELECT id, page_name, page_link FROM pages";
$page_result = mysqli_query($connection, $page_query);

function fetch_as_array($result){
  $array = array();

  while($row = mysqli_fetch_assoc($result)){
    array_push($array, $row);
  }

  return $array;
}

$subject_array = fetch_as_array($subject_result);
$page_array = fetch_as_array($page_result);

// Different stuff is below:

foreach($subject_array as $subject){

  $subject_array['pages'] = array();

  foreach($page_array as $page){

    if($page['page_link'] == $subject['subject_link']){

        array_push($subject_array['pages'], $page);
    }
  }
}

// Initiate a new mustache engine with the directory being the inside the views folder.
$m = new Mustache_Engine(array(
   'loader' => new Mustache_Loader_FilesystemLoader('/views')
));

// render using the 'subjects.mustache' file and the $subject_array to populate the template
echo $m->render('subjects', $subject_array); 

?>

然后使用已经排序的视图数据,您可以编写一个模板来使用此数据:

subjects.mustache

<ul>
    {{#subjects}}
        <li>
            <a href="?subject={{id}}">{{subject_name}}</a>
            <ul>
                {{#pages}} 
                    <li>
                        <a href="?page={{id}}">{{page_name}}</a>
                    </li> 
                {{/pages}}
            </ul>
        </li>
    {{/subjects}}
</ul>

因此它迫使您将 PHP 分开并专注于编写更好、更易于维护的代码。 {{mustache}} 只是其中一种模板语言,Jade 也非常酷并且提供了非常好的语法,它提供了这样的编写标记:

h1 Hello world
span= myVariable

而不是:

<h1>Hello World</h1>
<span><?php echo $myVariable; ?></span>