PHP / PostgreSQL циклы while и foreach, пропускающие первую запись - PullRequest
0 голосов
/ 24 октября 2018

Я тестирую вывод запросов в html таблицы, но по какой-то причине не могу понять, почему пропущена первая запись запросов.

Предположим, мой запрос имеет вид $userResults = pg_query($db,"SELECT * FROM users;");

И мой table as;

<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 голосов
/ 24 октября 2018

Вы можете использовать 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>

0 голосов
/ 24 октября 2018

Вы получаете первую на первой итерации при отображении заголовков.вызов 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>";
    }
 ?>
...