如何为内容而不是硬编码html制作动态php div

时间:2013-11-05 14:13:38

标签: php

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

希望这有助于理解。感谢

3 个答案:

答案 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)

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

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

    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
}
?>