我是从一个教程中写的,下面的代码从数据库中的表中获取内容,但内容所在的div被硬编码到html文件中。
如何根据内容的数量将此代码转换为可根据需要创建尽可能多的div。 我的意思是,下面的代码将内容分成每个div 10行,然后创建下一个div。我想保留这个结构但是动态创建代码,这样如果db中有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>
修改
这是functions.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>';
希望这有助于理解。感谢
答案 0 :(得分:1)
我建议重写(至少)部分代码,因为我认为(数据库)逻辑和输出应该分开。
但是,在你的代码中它没有分开,所以为什么甚至将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
是这里的简单解决方案,因为你总是期望一个整数。 / p>
由于您不熟悉PHP,因此您可能不知道modulo operator %
。我希望这个例子有所帮助:
(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
答案 1 :(得分:0)
你说你发布的代码不是来自你的,不是吗?无论如何,回答你的问题,我会这样做:
这是您的数组的建议结构:
Array( group_num => Array( row_num => Array( row parameters ) ) )
答案 2 :(得分:-1)
您可以使用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
}
?>