каждый. У меня тут немного загадки 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();
?>
Если мне нужно что-то опубликовать, дайте мне знать, это мой первый вопрос, так что я просто чувствую это.
Делая ваши $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, чтобы обработать их в выводе:
$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-правил).Также обратите внимание — приведенный выше код не проверен — вводится прямо в браузере. Там могут быть некоторые синтаксические ошибки — дайте мне знать, если у вас возникнут проблемы, и я с радостью отредактирую ответ. (или вы можете предложить редактировать).