【问题标题】:Is it possible to wrap looping PHP output in tags?是否可以在标签中包装循环 PHP 输出?
【发布时间】:2015-07-22 19:00:44
【问题描述】:

每个人。我在这里遇到了一些 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();
?>

如果我需要发布任何其他内容,请告诉我,这是我的第一个问题,所以我只是感觉一下。

【问题讨论】:

  • mysql_connect()/mysql_select_db() 不与mysqli_query()/mysqli_fetch_array() 混合使用。我假设那些 mysql_connect()/mysql_select_db() 是应该删除的旧代码行,就像你有 require('mysqli_connect.php');?
  • 您的代码工作正常吗?然后我会为你提供解决方案。

标签: php loops styling


【解决方案1】:

通过使用$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>';
}
?>

【讨论】:

  • 我想我暂时先使用这个——它仍然会破坏页面,因为 CSS 很荒谬,但至少效果更好。谢谢!
  • 想通了,这很好用!非常感谢,这给我带来了几个星期的问题!
【解决方案2】:

改用这样的方法:获取您在第一个查询中需要的所有数据,然后使用 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. 您可能不需要那些 &lt;br /&gt; 标记 - &lt;h2&gt; 是块级元素,因此无论如何它都会强制自己进入自己的行(除非某处有一些愚蠢的 CSS 规则)。

另请注意 - 上述代码未经测试 - 直接输入浏览器。可能存在一些语法错误 - 如果您发现任何问题,请告诉我,我会很乐意编辑答案。 (或者您可以提出修改建议)。

【讨论】:

  • 注意:未定义变量:导致第 10 行的 C:\xampp\htdocs\phprevamp\get2.php 警告:mysqli_fetch_array() 期望参数 1 为 mysqli_result,在 C:\xampp\ 中给出 null htdocs\phprevamp\get2.php 在第 10 行它在我加载它时抛出了这些错误......
  • @JetlagMadman 啊,对 - 我错过了 $result = mysqli_query($dbcon, $q); 部分。更新。干杯。
猜你喜欢
  • 2019-05-29
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多