所以我想填充并显示一个html表,它有两列宽。但是,无论我尝试什么,我的数据总是粘在一起。
问题是,我实际上想把整个数据放到一个表中,在表中按起始字母排序。
这是我的密码:
<?php include_once 'Database/dbh.php'; ?>
<!DOCTYPE html>
<html>
<body>
<?php
$fetch = "SELECT DISTINCT Kategori, LEFT(Kategori, 1) AS Letter FROM kategorier ORDER BY Kategori;";
$result = mysqli_query($conn, $fetch);
$resultCheck = mysqli_num_rows($result);
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
if (!isset($lastLetter) || $lastLetter != $row['Letter']) {
$lastLetter = $row['Letter'];
echo "<h2>", $row['Letter'], "</h2>";
}
echo "<table><tr><td>" . $row['Kategori'] . "</td></tr></table>";
}
}
?>
</body>
</html>
下面是一张现在的照片:
下面是我想要的样子:
4条答案
按热度按时间u0njafvf1#
更改为(未测试):
}
希望这对您有所帮助;)
干杯
尼古拉斯
v9tzhpje2#
很抱歉让你失望,但解决办法比你想象的要复杂一些。如我所见,艾恩伯已经建议过了。所以,如果他写了一个答案,首先考虑他的答案是公平的。
建议
关于关注点分离:
现在让我首先说,为了将来,你应该熟悉关注点分离原则。简单地说,以您的代码为例:始终将涉及数据库访问(用于获取数据、更新等)的代码与显示数据的代码(例如页面的html部分)分开。
这意味着,如果您需要从数据库中获取数据,请在网页顶部执行,并将其保存在数组中。然后,只需在网页的html部分中使用这些数组,而不是一些与db相关的函数,如
mysqli_query
,或mysqli_fetch_assoc
为了清楚起见,请参阅我提供的代码的html部分(“index.php”)。这种方法的一大优点是,您可以将整个php代码从页面顶部移动到php函数或类方法中。然后数组将只包含调用这些函数/方法产生的数据。
以上所有陈述的要点是什么?随意处理php代码和网页顶部的数据,并将结果保存在php数组中。数组最终应该具有这样一种结构,即网页的html部分的工作将非常简单:只读取和显示数组元素。
所以不要把html代码和db相关的代码混在一起。如果你这么做了,那么代码就很难维护了。
关于从php打印客户端代码:
将来您应该记住的另一个重要约定是,不要使用php代码打印任何客户端代码。e、 g.不要使用这样的语句
echo "<table><tr><td>"...
. 在这个echo
在这种情况下,只需将要呈现的内容保存到变量中,并根据需要在网页的html部分显示它们。关于准备好的报表:
如果您需要执行带参数的sql语句,那么使用prepared语句(而不是
mysqli::query
在这种情况下)。它们将保护您的代码不受最终sql注入的影响。为了完成,在这个答案的最后我贴了一个例子index.php
使用准备好的语句而不是mysqli::query
.问题解决方案:
步骤:
关于我准备的解决方案,它包括四个步骤:
从数据库获取数据并将其保存到数组中(
$data
).首先,创建第二个数组(
$formattedData
). 然后遍历$data
并将其项目保存到$formattedData
这样,它们就可以很容易地显示在选定的html结构中(div
对于信件,table
对于类别)。迭代
$formattedData
并用null
作为每个字母最后一个类别行中缺少的每个类别的类别名称。抱歉,我在这里写了一句话,但是,如果您阅读我代码中的注解,您肯定会更好地理解我的意思。通过迭代显示页面的html部分中的数据
$formattedData
并读取其值。当然,您可以根据需要优化php代码和/或将其分发到两个或三个函数中。然后您可以调用它们并将它们的返回值赋给
$data
以及$formattedData
变量。注:
如果您使用我的连接代码,请不要忘记用您的数据库凭据替换我的数据库凭据。
索引.php
自定义.css
数据库/dbh.php
用于测试的数据
结果
其他内容:
这是一个如何使用准备好的语句而不是
mysqli::query
. 注意,我只把数据获取代码放在这里。其余代码与上面的omolog部分相同index.php
页面,使用mysqli::query
.索引.php
s2j5cfk03#
我建议您可以使用引导模板,并使用下面的代码的结果,结果将在两列分开,因为你需要。
a0x5cqrl4#
我建议使用definitionlist元素而不是table元素
dl
,因为它的目的是您想要的显示结果。不过,为了解决您的问题,我建议进行一些修改。首先,请记住
DISTINCT
应用于整个列列表,而不仅仅是它旁边的列。其次,ORDER BY
在php中,从mysql排序通常比按字母顺序排序慢,而且mysql不按字母数字值排序naturally
. 最后,由于数据需要按字母顺序进行迭代,以确定在移动到下一个组之前要显示的第一个字母,因此使用LEFT()
在mysql中,查询并不是真正需要的。定义列表示例:https://3v4l.org/hetha
表格数据:
数据库结果:(mysql将按
1, 10, 2, 20
,不是1, 2, 10, 20
)排序的php数组结果:
结果html输出:
注:使用
float
将从左到右排序,即。如果你想做更复杂的css样式,比如
columns
分类。可以改用嵌套列表。但是,最好在显示视图中对数据进行迭代之前对其进行组织。嵌套列表示例:https://3v4l.org/bavgw
结果html输出:
注意:使用
columns
css定义,将从左上到右下排序。至于你想要的
table
元素用法。您可以使用嵌套列表示例php代码,其中包含以下html。但是,为了确保整个表是统一的,您将需要使用单个表。colspan="2"
可用于类别索引行,以跨两列展开它们。要确定何时需要新行,% 2
将在类别的每个偶数迭代中发生。以及使用count
确定是否需要将空表单元格添加到当前类别列表中,并避免创建额外的空表行。表格示例:https://3v4l.org/zun20
生成的html:
注:使用
table
将从左到右排序。即