大家。我在这里遇到了一些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();
?>
如果我需要发布任何其他内容,请告诉我,这是我的第一个问题,所以我只是感觉到它。
答案 0 :(得分:0)
尝试这样的事情:在第一次查询中获取所有数据,然后使用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规则)。另请注意 - 以上代码未经测试 - 直接输入浏览器。可能存在一些语法错误 - 如果您发现任何问题,请告诉我,我很乐意编辑答案。 (或者你可以建议编辑)。
答案 1 :(得分:0)
通过执行$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>';
}
?>