是否可以在标签中包装循环 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'];
}

注意几点:

  1. 我添加了使用 htmlentities 来转义用户数据,这样恶意的人就无法在某处输入 HTML 并将其显示在您的网站上。在 html 站点中显示数据库中的数据的几乎任何地方都应该这样做,除非在极少数情况下您知道自己在做什么。
  2. 你可能不需要那些 <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>';
}
?>