我有一个简单的脚本,使用 sql 查询从数据库中获取数据并按特定列对信息进行排序。我希望每次"层"更改时都能创建一个新的 html 表,如下面的查询所示。如何分解它,以便层显示在新的附加 HTML 表中?下面获取并显示信息,但无法区分层。关于如何格式化它的任何想法?
<?php
// You can place PHP like this
echo "<table class='table table-striped table-bordered table-hover table-condenced table-responsive'>";
echo "<tr><th>Channel</th><th>Description</th></tr>";
class TableRows extends RecursiveIteratorIterator {
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
return "<td>" . parent::current(). "</td>";
}
function beginChildren() {
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "'n";
}
}
$servername = "localhost";
$username = "test";
$password = "pass";
$dbname = "Channel_Lineup";
try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("SELECT channel, description FROM Channel_LineUps WHERE Market_ID = 1 ORDER BY Tier ASC");
$stmt->execute();
// set the resulting array to associative
$result = $stmt->setFetchMode(PDO::FETCH_ASSOC);
foreach(new TableRows(new RecursiveArrayIterator($stmt->fetchAll())) as $k=>$v) {
echo $v;
}
}
catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$conn = null;
echo "</table>";
?>
您的 SQL 语句没有返回层,因此很难打开它。
如果您更改请求以返回层(将层放在首位会使事情更简单):
$stmt = $conn->prepare("SELECT tier, channel, description FROM Channel_LineUps WHERE Market_ID = 1 ORDER BY Tier ASC");
然后,您可以向 TableRows
类添加一个lastTier
值,如果当前层与上次看到的层不同,则让 beginChildren
函数输出表标记。 您还可以将current()
函数更改为不输出"层"。
class TableRows extends RecursiveIteratorIterator {
private $lastTier = NULL;
function __construct($it) {
parent::__construct($it, self::LEAVES_ONLY);
}
function current() {
if (parent::key() != "tier") return "<td>" . parent::current(). "</td>";
}
function beginChildren() {
if ($this->lastTier != parent::current()) {
if (!is_null($this->lastTier)) echo "</table>'n";
echo "<table class='table table-striped table-bordered table-hover table-condenced table-responsive'>'n";
$this->lastTier = parent::current();
}
echo "<tr>";
}
function endChildren() {
echo "</tr>" . "'n";
}
}
SQL 语法纳粹免责声明:我老了,从 80 年代初就开始做数据库了。 所以我将使用我熟悉的语法,而不是 OPs 类语法。
这是我对我相信你正在努力做的事情的解释。 我并不总是得到正确的解释。 我的代码通常非常高效,因为自从Apple II发布以来,我一直在编写代码,效率是必要的。
while ($row = @mysql_fetch_array($results, MYSQL_NUM)){$lineups[] = $row;}
mysql_free_result($results);
unset($row);
echo '<table>';
foreach ($lineups as $val
if ($val[0] != $saveTier){
$saveTier = $val[0];
echo '</table><table>';
}
echo "<tr><td>$val[0]</td><td>$val[1]</td><td>$val[2]</td><td>$val[3]</td><tr>'n";
}
echo '</table>';
我不使用关联键,只使用数字。 在这种情况下,您的Tier
$row[0]
因此请相应地进行编辑。
如果层是非数字,则$saveTier = -1;
更改为$saveTier = 'x';
笔记
我喜欢先将整个表放入一个数组中。 这加快了表访问的速度,因为它是一次性完成的。
我只使用数字键,因为它们更有效。