是否可以在标签中包装循环 PHP 输出?
Is it possible to wrap looping PHP output in tags?
各位。我在这里遇到了一个 PHP 难题,我找不到已经存在的好的答案。你看,我正在做一个项目,我必须拿一个同学的唱片网站并用 PHP 改造它,而不是硬编码专辑封面和曲目列表,它会查询数据库为他们。我的问题是我必须保持他网站的总体风格不变,而我在这方面遇到了麻烦。基本上,他的风格取决于 div 标签中的专辑封面、名称和曲目列表,而他所采用的风格是通过 Bootstrap 和他自己的自定义 CSS 样式表实现的。
在我开始漫无目的之前,我的问题是:有什么方法可以将循环输出包装在 HTML 标签中吗?我需要在 div 标签中获取专辑封面、专辑名称和曲目列表,但只有曲目列表循环。这是我用来查询数据库的代码:
<?php
require ('mysqli_connect.php');
// Connect to database server
mysql_connect("localhost", "admin", "instructor") or die(mysql_error());
// Select database
mysql_select_db("phprediscography") or die(mysql_error());
// SQL query
$q = "SELECT DISTINCT albums.albumname, albums.albumID, albums.coverart
FROM albums
JOIN tracks
ON albums.albumID=tracks.albumID"; //select UNIQUE results from database
$t = "SELECT trackname FROM tracks WHERE albumID = 1";
$b = "SELECT trackname FROM tracks WHERE albumID = 2";
$n = "SELECT trackname FROM tracks WHERE albumID = 3";
$r = "SELECT trackname FROM tracks WHERE albumID = 4";
$result = mysqli_query($dbcon, $q);
$result1 = mysqli_query($dbcon, $t);
$result2 = mysqli_query($dbcon, $b);
$result3 = mysqli_query($dbcon, $n);
$result4 = mysqli_query($dbcon, $r);
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { //loop through database to get each album
echo '<img class="img-responsive" src=' . $row['coverart'] . '>' . '<br />';
echo '<h2>' . $row['albumname'] . "</h2><br />";
if ($row['albumID'] == 1) {
foreach($result1 as $row1) { //loop through tracks and output to page
echo '<p>' . $row1['trackname'] . '</p>';
}
}
if ($row['albumID'] == 2) {
foreach($result2 as $row2) { //loop through tracks and output to page
echo '<p>' . $row2['trackname'] . '</p>';
}
}
if ($row['albumID'] == 3) {
foreach($result3 as $row3) { //loop through tracks and output to page
echo '<p>' . $row3['trackname'] . '</p>';
}
}
if ($row['albumID'] == 4) {
foreach($result4 as $row4) { //loop through tracks and output to page
echo '<p>' . $row4['trackname'] . '</p>';
}
}
}
// Close the database connection
mysql_close();
?>
如果我需要 post 任何其他问题,请告诉我,这是我的第一个问题,所以我只是摸索一下。
尝试这样的事情:获取您在第一个查询中需要的所有数据,然后使用 php 将其处理到您的输出中:
$q = "SELECT albums.albumname, albums.albumID, albums.coverart, tracks.trackname
FROM albums
JOIN tracks ON albums.albumID=tracks.albumID";
$result = mysqli_query($dbcon, $q);
$lastAlbumId = null;
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
if ($lastAlbumId != $row['albumID']) {
echo '<img class="img-responsive" src="'.htmlentities($row['coverart']).'"><br />';
echo '<h2>'.htmlentities($row['albumname']).'</h2><br />';
}
echo '<p>'.htmlentities($trackname).'</p>';
$lastAlbumId = $row['albumID'];
}
注意几点:
- 我添加了使用
htmlentities
来转义用户数据,这样恶意的人就无法在某处输入 HTML 并将其显示在您的网站上。在 html 站点中显示数据库中的数据的几乎任何地方都应该这样做,除非在极少数情况下您知道自己在做什么。
- 你可能不需要那些
<br />
标签 - <h2>
是一个块级元素,所以它会强制自己在它自己的行上(除非有一些愚蠢的 CSS某处规则)。
另请注意 - 上面的代码未经测试 - 直接输入浏览器。可能存在一些语法错误 - 如果您发现任何问题请告诉我,我会很乐意编辑答案。 (或者您可以提出修改建议)。
通过执行 $t = "SELECT trackname FROM tracks WHERE albumID = #";
和 if($row['albumID']==#)
,您基本上仍然是硬编码,类似于您的朋友。只需执行 1 个查询,您就可以在其中加入所有曲目。然后在循环时,按 albumname
-
分组
<?php
require('mysqli_connect.php');
// SQL query
$q = "SELECT albums.albumname, albums.albumID, albums.coverart, tracks.trackname
FROM albums
JOIN tracks
ON albums.albumID=tracks.albumID";
$result = mysqli_query($dbcon, $q);
$current_albumID = ""; //create current albumID var to be used below.
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){//loop through database to get each album
if($row['albumID'] != $current_albumID){
echo '<img class="img-responsive" src='.$row['coverart'] . '>' . '<br />';
echo '<h2>' . $row['albumname'] . "</h2><br />";
$current_albumID = $row['albumID']; // set current albumID to this albumID
}
echo '<p>' . $row['trackname'] . '</p>';
}
?>
各位。我在这里遇到了一个 PHP 难题,我找不到已经存在的好的答案。你看,我正在做一个项目,我必须拿一个同学的唱片网站并用 PHP 改造它,而不是硬编码专辑封面和曲目列表,它会查询数据库为他们。我的问题是我必须保持他网站的总体风格不变,而我在这方面遇到了麻烦。基本上,他的风格取决于 div 标签中的专辑封面、名称和曲目列表,而他所采用的风格是通过 Bootstrap 和他自己的自定义 CSS 样式表实现的。
在我开始漫无目的之前,我的问题是:有什么方法可以将循环输出包装在 HTML 标签中吗?我需要在 div 标签中获取专辑封面、专辑名称和曲目列表,但只有曲目列表循环。这是我用来查询数据库的代码:
<?php
require ('mysqli_connect.php');
// Connect to database server
mysql_connect("localhost", "admin", "instructor") or die(mysql_error());
// Select database
mysql_select_db("phprediscography") or die(mysql_error());
// SQL query
$q = "SELECT DISTINCT albums.albumname, albums.albumID, albums.coverart
FROM albums
JOIN tracks
ON albums.albumID=tracks.albumID"; //select UNIQUE results from database
$t = "SELECT trackname FROM tracks WHERE albumID = 1";
$b = "SELECT trackname FROM tracks WHERE albumID = 2";
$n = "SELECT trackname FROM tracks WHERE albumID = 3";
$r = "SELECT trackname FROM tracks WHERE albumID = 4";
$result = mysqli_query($dbcon, $q);
$result1 = mysqli_query($dbcon, $t);
$result2 = mysqli_query($dbcon, $b);
$result3 = mysqli_query($dbcon, $n);
$result4 = mysqli_query($dbcon, $r);
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { //loop through database to get each album
echo '<img class="img-responsive" src=' . $row['coverart'] . '>' . '<br />';
echo '<h2>' . $row['albumname'] . "</h2><br />";
if ($row['albumID'] == 1) {
foreach($result1 as $row1) { //loop through tracks and output to page
echo '<p>' . $row1['trackname'] . '</p>';
}
}
if ($row['albumID'] == 2) {
foreach($result2 as $row2) { //loop through tracks and output to page
echo '<p>' . $row2['trackname'] . '</p>';
}
}
if ($row['albumID'] == 3) {
foreach($result3 as $row3) { //loop through tracks and output to page
echo '<p>' . $row3['trackname'] . '</p>';
}
}
if ($row['albumID'] == 4) {
foreach($result4 as $row4) { //loop through tracks and output to page
echo '<p>' . $row4['trackname'] . '</p>';
}
}
}
// Close the database connection
mysql_close();
?>
如果我需要 post 任何其他问题,请告诉我,这是我的第一个问题,所以我只是摸索一下。
尝试这样的事情:获取您在第一个查询中需要的所有数据,然后使用 php 将其处理到您的输出中:
$q = "SELECT albums.albumname, albums.albumID, albums.coverart, tracks.trackname
FROM albums
JOIN tracks ON albums.albumID=tracks.albumID";
$result = mysqli_query($dbcon, $q);
$lastAlbumId = null;
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
if ($lastAlbumId != $row['albumID']) {
echo '<img class="img-responsive" src="'.htmlentities($row['coverart']).'"><br />';
echo '<h2>'.htmlentities($row['albumname']).'</h2><br />';
}
echo '<p>'.htmlentities($trackname).'</p>';
$lastAlbumId = $row['albumID'];
}
注意几点:
- 我添加了使用
htmlentities
来转义用户数据,这样恶意的人就无法在某处输入 HTML 并将其显示在您的网站上。在 html 站点中显示数据库中的数据的几乎任何地方都应该这样做,除非在极少数情况下您知道自己在做什么。 - 你可能不需要那些
<br />
标签 -<h2>
是一个块级元素,所以它会强制自己在它自己的行上(除非有一些愚蠢的 CSS某处规则)。
另请注意 - 上面的代码未经测试 - 直接输入浏览器。可能存在一些语法错误 - 如果您发现任何问题请告诉我,我会很乐意编辑答案。 (或者您可以提出修改建议)。
通过执行 $t = "SELECT trackname FROM tracks WHERE albumID = #";
和 if($row['albumID']==#)
,您基本上仍然是硬编码,类似于您的朋友。只需执行 1 个查询,您就可以在其中加入所有曲目。然后在循环时,按 albumname
-
<?php
require('mysqli_connect.php');
// SQL query
$q = "SELECT albums.albumname, albums.albumID, albums.coverart, tracks.trackname
FROM albums
JOIN tracks
ON albums.albumID=tracks.albumID";
$result = mysqli_query($dbcon, $q);
$current_albumID = ""; //create current albumID var to be used below.
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){//loop through database to get each album
if($row['albumID'] != $current_albumID){
echo '<img class="img-responsive" src='.$row['coverart'] . '>' . '<br />';
echo '<h2>' . $row['albumname'] . "</h2><br />";
$current_albumID = $row['albumID']; // set current albumID to this albumID
}
echo '<p>' . $row['trackname'] . '</p>';
}
?>