我从教程中编写,下面的代码从数据库中的表中获取内容,但内容所在的div被硬编码到html文件中。
我如何将此代码转换为将根据内容数量创建所需数量的div 的内容。我的意思是,下面的代码将内容分成每个div 10 行,然后创建下一个div。 我想保留这个结构,但动态创建代码,以便如果数据库中有 22 行,那么它将需要产生 3 个div,如果有 50 行,它将需要 5 个div 等。 对于每个div,它不需要重复相同的 10,而是从每个div 的下一行开始。
谁能帮忙?
谢谢
<div class="down_col">
<?php
$startAt = empty($_GET['startAt']) ? 0 : $_GET['startAt'];
require_once 'functions.php';
printDownTrans($startAt, 10);
?>
</div>
<div class="down_col">
<?php
require_once 'functions.php';
printDownTrans($startAt + 10, 10);
?>
</div>
<div class="down_col">
<?php
require_once 'functions.php';
printDownTrans($startAt + 20, 10);
?>
</div>
编辑
这是函数的主要部分.php它从 db 检索数据并将一些数据连接在一起:
if (mysqli_connect_errno($link)) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit(0);
}
// Retrieve the rows from sampleTable table.
$query = "SELECT * FROM sampleTable ORDER BY Data1, Data2 LIMIT $startAt,$amount";
if ($result = mysqli_query($link, $query)) {
while ($row = mysqli_fetch_row($result)) {
$data1Data2 = $row[1] . ' - ' . $row[2];
echo '<p><a href="sample/sample/' . $data1Data2 . '.pdf" target="_self">' . $data1Data2 . '</a></p>';
希望这有助于理解。 谢谢
我建议(至少)重写那部分代码,因为我认为(数据库)逻辑和输出应该分开。
但是,在您的代码中,它不是分开的,那么为什么还要将div 与它分开呢?如果您不愿意,函数中的数据库逻辑可以很容易地用于实现您想要的内容。
// new function parameters:
// $maxCols maximum number of divs default=NULL
// $colSize how many rows in one col default=10
if ($maxCols !== NULL)
$limit = ','.$maxCols * $colSize;
else
$limit = '';
$query = "SELECT * FROM sampleTable ORDER BY Data1, Data2 LIMIT ".$startAt.$limit;
if ($result = mysqli_query($link, $query)) {
$currentRow = 1;
echo '<div class="down_col">';
while ($row = mysqli_fetch_row($result)) {
if ($currentRow % $colSize == 0)
echo '</div><div class="down_col">';
$data1Data2 = $row[1] . ' - ' . $row[2];
echo '<p><a href="sample/sample/' . $data1Data2 . '.pdf" target="_self">' . $data1Data2 . '</a></p>';
$currentRow++;
}
echo '</div>';
}
现在你可以像这样简单地调用一次函数
$startAt = empty($_GET['startAt']) ? 0 : intval($_GET['startAt']);
// version 1: print all rows in cols of size 10
printDownTrans($startAt);
// version 2: print maximum of 3 cols of size 10
printDownTrans($startAt, 3);
// version 3: print maximum of 5 cols of size 8
printDownTrans($startAt, 5, 8);
您永远不能相信用户输入!特别是当您使用数据库时,这是一个很大的漏洞。设置后,$_GET['startAt']
将在查询中使用,没有任何转义(也许在您未发布的部分中?) - intval
是这里的简单解决方案,因为您总是期望一个整数。
由于您不熟悉 PHP,因此您可能不知道模运算符 %
。我希望这个例子有所帮助:
(1 % 10 == 0) -> (1 == 0) -> false
(4 % 10 == 0) -> (4 == 0) -> false
(10 % 10 == 0) -> (0 == 0) -> TRUE
(11 % 10 == 0) -> (1 == 0) -> false
(20 % 10 == 0) -> (0 == 0) -> TRUE
你说你发布的代码不是你的,不是吗?无论如何,回答你的问题,我会做如下:
- 对数据库执行查询以获取所有行。
- 在 while 循环中,将行存储在一个多维数组中,该数组具有您要打印的结构:您将有两个计数器(一个用于行,一个用于组),当行计数器达到 10 时,您增加组计数器并将行计数器重置为零。
- 执行 foreach 以遍历数组,打印 html 代码。
这是数组的建议结构:
Array( group_num => Array( row_num => Array( row parameters ) ) )
您可以使用 ceil 函数,这里是您的示例代码
$sql = "SELECT * FROM eh_patient WHERE site_id =3 ORDER BY id_patient";
$result_fatch = mysqli_query($link, $sql) or die(mysqli_error($link));
$row = mysqli_num_rows($result_fatch);
$max = ceil($row/10);
for($i=0; $i<$max; $i++) {
?>
<div class="down_col">
<?php
$startAt = empty($_GET['startAt']) ? 0 : $_GET['startAt'];
require_once 'functions.php';
printDownTrans($startAt, 10);
?>
</div>
<?php
}
?>