PHP / PostgreSQL while和foreach循环跳过第一条记录

时间:2018-10-24 10:41:06

标签: php postgresql foreach html-table while-loop

我正在测试将查询输出到html表中,但是由于某些原因,我无法弄清为什么跳过了查询的第一条记录。

假设我的查询为 $userResults = pg_query($db,"SELECT * FROM users;");

我的table为;

<table id='table1'>
    <div id='t1' class='table100-head'>
        <thead>
            <tr class='row100 head' id="tblHeader">
                <!-- Table header -->
                <?php
                    $header = pg_fetch_assoc($userResults);

                    foreach ($header as $column => $value) {
                        $columnName = trim($column,"'");
                        echo "<th class='cell100 column2'>" . $columnName . "</th>";
                    }
                ?>
            </tr>
        </thead>
    </div>
    <div class='table100-body js-pscroll'>
        <tbody id="tblBody">
            <?php
                while ($body = pg_fetch_assoc($userResults)) {
                    echo "<tr class='row100 body'>";
                        foreach ($body as $column2 => $value2) {
                            echo "<td class='cell100 column2'>" . $value2 . "</td>";
                        }
                    echo "</tr>";
                }
            ?>
        </tbody>
    </div>
</table>

上面的结果将导致<tbody>中除第一条记录以外的所有行。例如,如果说结果的user_id为1到10,则只会显示2到10。

我知道它与循环有关,但我无法指出确切的位置。我不想专门使用while循环的原因是;

  1. 我不想以编程方式指定列名。
  2. 列名因用户而异

我该如何解决?

2 个答案:

答案 0 :(得分:2)

在显示标题时,您正在获取第一次迭代中的第一个。呼叫pg_fetch_assoc($userResults)将获得下一行。 在开始下一次迭代之前,需要将“在结果资源中设置内部行偏移量”设置为0。使用:

pg_result_seek($userResults, 0);

您应该以如下形式结束: ...

<?php
    pg_result_seek($userResults, 0);
    while ($body = pg_fetch_assoc($userResults)) {
        echo "<tr class='row100 body'>";
        foreach ($body as $column2 => $value2) {
           echo "<td class='cell100 column2'>" . $value2 . "</td>";
        }      
        echo "</tr>";
    }
 ?>

答案 1 :(得分:0)

您可以使用do-while,

<table id='table1'>
<div id='t1' class='table100-head'>
    <thead>
        <tr class='row100 head' id="tblHeader">
            <!-- Table header -->
            <?php
                $header = pg_fetch_assoc($userResults);

                foreach ($header as $column => $value) {
                    $columnName = trim($column,"'");
                    echo "<th class='cell100 column2'>" . $columnName . "</th>";
                }
            ?>
        </tr>
    </thead>
</div>
<div class='table100-body js-pscroll'>
    <tbody id="tblBody">
        <?php
            do {
                echo "<tr class='row100 body'>";
                    foreach ($body as $column2 => $value2) {
                        echo "<td class='cell100 column2'>" . $value2 . "</td>";
                    }
                echo "</tr>";
            } while ($body = pg_fetch_assoc($userResults)) 
        ?>
    </tbody>
</div>