variable/function 中的 MySQLi 查询(稍后可用于回显内容)

MySQLi query in variable/function (that can be later used to echo content)

所以我遇到了一个问题。我正在 PHP 中创建某种 "templated" 页面(不,我不能使用 Twig 或类似的东西),稍后将随着实际内容增加。

我这里的主要问题是在导航栏中回显链接。我使用的是 MaterializeCSS,所以为了使导航栏响应是在不同的 UL 中编写两次链接。我可以很容易地回应一次,就像这样:

<?php
$sql = "SELECT id, pagename, filename FROM NavbarLinks";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    $navstructure =
         <<<HTML
         <header>
         <nav class="$primarycolor">
         <div class="container">
            <div class="nav-wrapper">
              <a href="#!" class="brand-logo">$sitename</a>
              <ul class="right hide-on-med-and-down">

HTML;
    echo $navstructure;
    //  output data of each row
    while($row = $result->fetch_assoc()) {
        echo '<li><a href="' . $row['filename'] . '">' . $row['pagename'] . '</a></li>
        ' ;
    }

    }
    echo "
    </ul>
  </div>
  </div>
  </nav>
  </header>";

?>

这没有错误。问题是,我需要那个(根据 MaterializeCSS specifications/documentation):

<nav>
<div class="nav-wrapper">
  <a href="#!" class="brand-logo">Logo</a>
  <a href="#" data-activates="mobile-demo" class="button-collapse"><i class="material-icons">menu</i></a>
  <ul class="right hide-on-med-and-down">
     // links
  </ul>
  <ul class="side-nav" id="mobile-demo">
    // links again
  </ul>
</div>
</nav>

所以我想做的很简单:制作一个 navbar.php 并在 HEREDOC 变量上具有结构,在变量 $navbarlinks 中我将打印我从第一个获得的所有链接我给你看的代码。我的问题是将链接放在变量中而不是显示所有结果只会打印一个,我找不到改变它的方法。

我应该怎么做才能让 $navbarlinksnavbarlinks() 打印所有 mySQL 结果并在任何地方工作?

不再练习 php 但据我所知 html/css 元素不必传递给变量.. 你可以在 php 之前结束 css 元素并从循环

中再次打开 php
    <?php
    $sql = "SELECT id, pagename, filename FROM NavbarLinks";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        ?>

         <HTML
         <header>         
            <nav class="$primarycolor">
             <div class="container">
                <div class="nav-wrapper">
                  <a href="#!" class="brand-logo">  <?php=$sitename?> </a>
                  <ul class="right hide-on-med-and-down">


     <?php

        while($row = $result->fetch_assoc()) {
            echo '<li><a href="' . $row['filename'] . '">' . $row['pagename'] . '</a></li>
            ' ;
        }

      ?>

        </ul>
      </div>
      </div>
      </nav>
      </header>";

<?php
  }
   ?>
<!-- end -->

你只想把它放在一个数组中以备后用。您还应该尝试将 PHP 与 HTML 分开,这可能是一个好的开始,但仍然需要像 HTML escaping. Note in particular the use of alternative syntax and short echo tags 这样的东西。

<?php
$links = [];
$sql = "SELECT id, pagename, filename FROM NavbarLinks";
$result = $conn->query($sql);
if ($result) {
    while($row = $result->fetch_assoc()) {
        $links[] = array_map('htmlspecialchars', $row);
    }
}
// PHP is finished now, here's the HTML
?>

<?php if (count($links)):?>

         <header>
         <nav class="<?=$primarycolor?>">
         <div class="container">
            <div class="nav-wrapper">
              <a href="#!" class="brand-logo"><?=$sitename?></a>
              <ul class="right hide-on-med-and-down">
    <?php foreach ($links as $link):?>
                  <li><a href="<?=$link['filename']?>"><?=$link['pagename']?></a></li>
    <?php endforeach?>

              </ul>

              <ul class="side-nav" id="mobile-demo">
    <?php foreach ($links as $link):?>
                  <li><a href="<?=$link['filename']?>"><?=$link['pagename']?></a></li>
    <?php endforeach?>

            </ul>
            </div>
         </div>
         </nav>
         </header>
<?php endif?>