【问题标题】:PHP / PostgreSQL while and foreach loops skipping first recordPHP / PostgreSQL while 和 foreach 循环跳过第一条记录
【发布时间】:2018-10-24 18:50:17
【问题描述】:

我正在测试将查询输出到 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>

除了第一条记录之外,以上将导致&lt;tbody&gt; 中的所有行都符合预期。例如,如果结果中的 user_id 为 1 到 10,则只会出现 2 到 10。

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

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

我该如何解决这个问题?

【问题讨论】:

  • 这是因为您正在运行 pg_fetch_assoc 来获取加载第一条记录的标题,并且当您再次调用它时,它会将光标移动到第二条记录。保留 for each 中的值并在第一行之前将它们回显,或者想一个更好的方法来获取您的列。
  • @RiggsFolly pg_query() 之后的代码与我在问题中提出的完全一样。我没有遗漏任何东西。
  • 你可以有 $printedHeaders = false; while fetch { if !$printedHeader, 打印标题。继续打印列}
  • @JackWilko 这实际上听起来像问题。让我试试修复。

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


【解决方案1】:

显示标题时,您将在第一次迭代中获取第一个。呼叫pg_fetch_assoc($userResults) 将获得下一行。 在开始下一次迭代之前,您需要将结果资源中的 Set internal row offset 设置为 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>";
    }
 ?>

【讨论】:

    【解决方案2】:

    你可以使用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>
    

    【讨论】:

    • 但是你的 Do-While 没有引用 $header 所以这不会有帮助。事实上它应该产生一个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2019-02-16
    • 2017-11-11
    • 1970-01-01
    • 2015-07-03
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多