【问题标题】:Dynamically build a table with PHP and mysql用php和mysql动态建表
【发布时间】:2018-06-17 21:08:17
【问题描述】:

我一直在阅读一些问答,但仍然没有设法构建我的算法,所以我正在寻求一些关于如何构建的帮助/建议。

所以,我有一个 MySQL 表,对于每个 mysql 表行,我想在表中显示它。我希望我的表只有 4 列(这意味着行数是可变的,具体取决于数据库中的数据)。因此,在 html 表的(第 1 行,第 1 列)中,将是来自 db 表第 1 行的数据,来自 db 表第 2 行的 html(第 1 行,第 2 列)数据......(第 2 行,第 1 列)来自 db 表的数据第 5 行,依此类推。

所以,表格应该是这样的:

[数据库行#1的数据] [数据库行#2的数据] [数据库行#3的数据] [数据库行#4的数据]

[数据库行#5的数据] [数据库行#6的数据] [数据库行#7的数据] [数据库行#8的数据]

等等……

这是我必须从 db 获取数据的内容:

function get_albums() {
    $albums = array();
    
    $albums_query = mysql_query("SELECT 'albums'.'album_id', 'albums'.'role_id', 'albums'.'timestamp', 'albums'.'name', LEFT('albums'.'description',50) as 'description', COUNT('images'.'image_id') as 'image_count'
    FROM 'albums'
    LEFT JOIN 'images'
    ON 'albums'.'album_id' = 'images'.'album_id'
    GROUP BY 'albums'.'album_id'");
        
    // Loop through all images
    while ($albums_row = mysql_fetch_assoc($albums_query)) {
        // multidimensional array
        $albums[] = array(
                    // associative array
                    'id' => $albums_row['album_id'],
                    'role' => $albums_row['role_id'],
                    'timestamp' => $albums_row['timestamp'],
                    'name' => $albums_row['name'],
                    'description' => $albums_row['description'],
                    'image_count' => $albums_row['image_count']
        );
    }   
    return $albums;
}

显示该信息:

$albums = get_albums();

echo '<table>';
for ($i=0; $i<(count($albums)/4); $i++) {
    echo '<tr>';

    //HERE IS WHERE I'M LOST

    foreach ($albums as $album) {
        echo '<a href="view_album.php?aid=',$album['id'],'">',$album['name'],'</a> (',$album['image_count'],') image(s)<br />',$album['description'],'...';

    }
    echo '</tr>';
}
echo '</table>';

那么,有什么想法吗?

【问题讨论】:

  • 您忘记了您的 &lt;td&gt; 标签并与 , 连接而不是 .
  • 您需要使用 modulus operator 并在 for 循环中删除除以 4。并对马特所说的 +1。
  • 首先,您在查询中的连接不正确。其次,您要为每个数据条目选择多列,但您想将所有这些列显示为一个单元格?我理解正确吗?
  • 我故意“忘记”了 标签,因为我不知道该写什么代码。
  • Palladium,nop,我想要每个表格单元格的每个数据库行...

标签: php mysql html-table


【解决方案1】:
// keep calculations outside of the for loop if you can

// this will display all albums (count($albums) / 4) times.

$limit = count($albums) / 4;
for ($i = 0; $i < $limit; $i++) {
    echo '<tr>';

    foreach ($albums as $album) {
        echo '<td><a href="view_album.php?aid=' . 
            $album['id'] . '">' . $album['name'] . '</a> (' . 
            $album['image_count'] . ') image(s)<br />' . 
            $album['description'] . '...</td>';
    }
    echo "</tr>";
}

您可能正在寻找的是

<?php
$counter = 0;

foreach($albums as $album) :
    // start new row 
    if ($counter == 0): ?>
        <tr>
    <?php endif; ?>
    <td><a href="view_album.php?aid=<?= $album['id'] ?>"><?= $album['name'] ?></a> (<?= $album['image_count'] ?>) image(s)<br />         
        <?= $album['description'] ?>...</td>
    <?php if ($counter++ == 3) : ?> <!-- 4 records printed in row; end row & reset counter -->
        </tr>
    <?php
        $counter = 0;
    endif;
endforeach;

$lastCount = $counter;
// print remaining empty cells
while ($counter ++ < 4) : ?>
    <td>&nbsp;</td>
endwhile;
// close row if necessary
if ($lastCount != 3) :
    </tr>
endif;

【讨论】:

  • 这不太对。这将输出与每行中的专辑一样多的&lt;td&gt;,并且包含与专辑的 25% 一样多的行。
  • @Josh 我刚刚注意到这一点,并为完整性和清晰度进行了编辑。谢谢!
  • 您的更新将每行创建 1 张专辑,而不是 OP 的目标,即每行 4 张专辑。
  • +1 我没有测试过,但你可能想使用前缀增量 (++$a),而不是后缀 ($a++)。否则,它似乎应该工作。
  • 我做了后缀,因为我想在增量之前进行比较。
猜你喜欢
相关资源
最近更新 更多
热门标签