0

我从一个教程中编写,下面的代码从数据库中的表中获取内容,但内容所在的 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>

编辑

这是 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>';

希望这有助于理解。谢谢

4

3 回答 3

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是这里的简单解决方案,因为您总是期望一个整数。

由于您是 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
于 2013-11-05T15:26:57.653 回答
0

你说你发布的代码不是你的,不是吗?无论如何,回答你的问题,我会这样做:

  1. 执行对数据库的查询以获取所有行。
  2. 在 while 循环中,将行存储在一个多维数组中,该数组具有您想要打印的结构:您将有两个计数器(一个用于行,一个用于组),当行计数器达到 10 时,增加组计数器并将行计数器重置为零。
  3. 做一个 foreach 遍历数组,打印 html 代码。

这是您的数组的建议结构:

Array( group_num => Array( row_num => Array( row parameters ) ) )
于 2013-11-05T14:29:37.847 回答
-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
}
?>
于 2013-11-05T14:47:52.780 回答