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
中我将打印我从第一个获得的所有链接我给你看的代码。我的问题是将链接放在变量中而不是显示所有结果只会打印一个,我找不到改变它的方法。
我应该怎么做才能让 $navbarlinks
或 navbarlinks()
打印所有 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?>
所以我遇到了一个问题。我正在 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
中我将打印我从第一个获得的所有链接我给你看的代码。我的问题是将链接放在变量中而不是显示所有结果只会打印一个,我找不到改变它的方法。
我应该怎么做才能让 $navbarlinks
或 navbarlinks()
打印所有 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?>