while-Loop в foreach-Loop с mysqli_query приводит к неожиданному результату - PullRequest
0 голосов
/ 28 января 2019

У меня есть кусок кода, чтобы получить данные из базы данных MySQL.Мне нужно построить контейнеры для всех станций с той же станцией station_group, что я делаю через цикл foreach.Внутри цикла foreach есть цикл while для заполнения контейнеров группы станций всеми станциями, у которых есть родительская станция station_group.Код работает нормально, если в коде есть отладка эхо-строк (так что какая-то задержка), но после их закомментирования код доставляет неправильный порядок контейнеров и станций.Я догадываюсь об этом из-за асинхронной функции fetch_assoc, поэтому я могу добавить функцию обратного вызова, но я просто не получаю ее запуска.Поэтому я бы оценил любую помощь ... =)

BR

<?php

        //build unique Station group array
        $sql_unique = "SELECT DISTINCT station_group FROM station ORDER BY station_group ASC";
        $unique_station_groups = mysqli_query($dbConn, $sql_unique);

        //get all station data
        $sql = "SELECT * FROM station ORDER BY station_group, station_id ASC";
        $result= mysqli_query($dbConn, $sql);

        //Loop for station_group
        foreach ($unique_station_groups as $station_group_value){
            echo '<div class="css-station-group>';
            while ($row = mysqli_fetch_assoc($result)) {

                //echo "<script>console.log(".json_encode($station_group_value).")</script>";
                //echo "<script>console.log(".json_encode($row).")</script>";
                $station_id = $row['station_id'];
                $station_name = $row['station_name'];
                $station_layout = $row['station_layout'];
                $station_group = $row['station_group'];

                if ($station_group_value['station_group']==$station_group) {
                    echo '<div class="station-container css_station-layout-'.$station_layout.
                    '" id='.$station_id.
                    '>'.$station_name.
                    '<br></div>';
                }
            }
            echo '</div>';
            mysqli_data_seek($result,0); //reset array, so next Loop will find values again
        }
        ?>

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Вам не нужны два запроса для этого.

Сохраните предыдущую группу станций и проверьте текущую группу и предыдущую группу, чтобы различать станции.

Немного изменил код

<?php
    //build unique Station group array
    // $sql_unique = "SELECT DISTINCT station_group FROM station ORDER BY station_group ASC";
    // $unique_station_groups = mysqli_query($dbConn, $sql_unique);

    //get all station data
    $sql = "SELECT * FROM station ORDER BY station_group ASC";
    $result= mysqli_query($dbConn, $sql);

    $rows = [];
    while ($row = mysqli_fetch_assoc($result)) {
        $rows[] = $row;
    }
    //Loop for station_group
    // foreach ($unique_station_groups as $station_group_value) {
    $current_station_group = null;
    echo '<div class="css-station-group">';
    foreach ($rows as $row) {

        //echo "<script>console.log(".json_encode($station_group_value).")</script>";
        //echo "<script>console.log(".json_encode($row).")</script>";
        $station_id = $row['station_id'];
        $station_name = $row['station_name'];
        $station_layout = $row['station_layout'];
        $station_group = $row['station_group'];

        if ($station_group != $current_station_group) {
            echo '<div class="station-container css_station-layout-'.$station_layout.
            '" id='.$station_id.
            '>'.$station_name.
            '<br></div>';
            $current_station_group = $row['station_group'];
        }
    }
    echo '</div>';
?>
0 голосов
/ 28 января 2019

Похоже, может быть проще просто вывести результаты в массив, а затем перебрать массив.

<?php

        //build unique Station group array
        $sql_unique = "SELECT DISTINCT station_group FROM station ORDER BY station_group ASC";
        $unique_station_groups = mysqli_query($dbConn, $sql_unique);

        //get all station data
        $sql = "SELECT * FROM station ORDER BY station_group, station_id ASC";
        $result= mysqli_query($dbConn, $sql);

        $rows = [];
        while ($row = mysqli_fetch_assoc($result)) {
            $rows[] = $row;
        }
        //Loop for station_group
        foreach ($unique_station_groups as $station_group_value){
            echo '<div class="css-station-group>';
            foreach ($rows as $row) {

                //echo "<script>console.log(".json_encode($station_group_value).")</script>";
                //echo "<script>console.log(".json_encode($row).")</script>";
                $station_id = $row['station_id'];
                $station_name = $row['station_name'];
                $station_layout = $row['station_layout'];
                $station_group = $row['station_group'];

                if ($station_group_value['station_group']==$station_group) {
                    echo '<div class="station-container css_station-layout-'.$station_layout.
                    '" id='.$station_id.
                    '>'.$station_name.
                    '<br></div>';
                }
            }
            echo '</div>';
        }
        ?>
...