Использовать массив результатов запроса MySQLi более одного раза - PullRequest
0 голосов
/ 18 мая 2018

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

Когда я пытаюсь повторить цикл while для повторения всех записей в базе данных, дважды, второй цикл while не работает, как если бы я переназначил переменную $ row на функцию mysqli_fetch_row (), содержащую мойрезультаты, он не может найти мои результаты.

Вот код:

<div class="section projects">
        <span class="heading">Blog</span>
        <p>
            Here i have compiled a list of articles that i have written. I will continue to update this list.
        </p>
        <div class="project-list">
            <?php

                if ($post_results) {
                    $panel_no = 1;  
                    /* fetch associative array */
                    while ($row = mysqli_fetch_row($post_results)) {
                        $result = glob ("posts/".$row[0]."/article-image.*");
                        echo "<div class='project-list-item'>";
                        echo "<img src='$result[0]' class='project-list-image' alt='Blog Item Image'>";
                        echo "<div class='project-heading'>".$row[1]."</div>";
                        echo "<div class='project-subheading'>".$row[2]."</div>";
                        echo "</div>";
                    }
                    ?>
        </div>
        <div class="carousel">
            <div class="chevron left">&laquo</div>
            <div class="chevron right">&raquo</div>
            <?php
                    while ($row = mysqli_fetch_row($post_results)){
                        echo "<div id='panel-". $panel_no ."' class='panel";
                            if($panel_no == 1){
                                echo " active";
                            }
                            echo "'>";
                            echo"<img src='".$result[0]."' id='panel-image". $panel_no ."' class='panel-image'>";
                            echo "<div class='panel-description'>";
                                echo "<div class='carousel-heading'>".$row[1]."</div>";
                                echo "<div class='carousel-caption'>".$row[2]."</div>";
                            echo "</div>";
                        echo "</div>";
                        $panel_no = $panel_no + 1;
                    }
                ?>
        </div>







        <?php
                /* free result set */
                mysqli_free_result($post_results);
            }
            ?>
    </div>

Есть некоторый JS на заднем плане, управляющий кнопками карусели и т. д., и он просто устанавливает панель каруселис присвоенным ему классом "active" display: block;, а все, что не имеет активного класса, имеет display: hidden;.

Первый цикл while работает, второй - нет.SQL определенно работает, так как, если я перевожу экран для мобильного размера, он отображает полный список именно так, как я хочу.

Есть что-то, чего я не вижу, что заставляет панель не появляться, любая помощьпризнателен.

Редактировать: это HTML-код, который выводится в данный момент при запуске этого кода (игнорируйте странное форматирование элементов списка мобильного представления).Это когда страница находится в представлении мобильного устройства.

<div class="section projects">
        <span class="heading">Blog</span>
        <p>
            Here i have compiled a list of articles that i have written. I will continue to update this list.
        </p>
        <div class="project-list">
            <div class="project-list-item"><img src="posts/28/article-image.jpg" class="project-list-image" alt="Blog Item Image"><div class="project-heading">Cars in a City</div><div class="project-subheading">This is an article about cars in a city.</div></div><div class="project-list-item"><img src="posts/29/article-image.jpg" class="project-list-image" alt="Blog Item Image"><div class="project-heading">Whitehaven Marina</div><div class="project-subheading">dsahidhsai</div></div><div class="project-list-item"><img src="posts/30/article-image.jpg" class="project-list-image" alt="Blog Item Image"><div class="project-heading">fcdsfds</div><div class="project-subheading">sadasdsa</div></div><div class="project-list-item"><img src="posts/31/article-image.jpg" class="project-list-image" alt="Blog Item Image"><div class="project-heading">fcdsfds</div><div class="project-subheading">sadasdsa</div></div><div class="project-list-item"><img src="posts/32/article-image.png" class="project-list-image" alt="Blog Item Image"><div class="project-heading">fvsdvsdc</div><div class="project-subheading">fcdcdsccdscds</div></div>            </div>
        <div class="carousel">
            <div class="chevron left">«</div>
            <div class="chevron right">»</div>
                        </div>







                </div>

1 Ответ

0 голосов
/ 18 мая 2018

Проблема здесь в том, что mysqli_fetch_row () перемещает внутренний указатель mysqli к следующему набору результатов.Поэтому, когда вы попытаетесь получить к нему доступ снова, для него не будет данных.

Одним из решений было бы создание пустого массива PHP перед первым массивом и сохранение в нем этих строк, а затем во втором цикле вы проходите через новый массив вместо fetch_array ().

Первый цикл:

   $posts = array();
   if ($post_results) {
        $panel_no = 1;  
        /* fetch associative array */
        while ($row = mysqli_fetch_row($post_results)) {
            $posts[] = $row;
            $result = glob ("posts/".$row[0]."/article-image.*");
            echo "<div class='project-list-item'>";
                echo "<img src='$result[0]' class='project-list-image' alt='Blog Item Image'>";
                echo "<div class='project-heading'>".$row[1]."</div>";
                echo "<div class='project-subheading'>".$row[2]."</div>";
            echo "</div>";
        }
    }

Второй цикл должен выглядеть примерно так:

foreach($posts as $row){
    $result = glob ("posts/".$row[0]."/article-image.*");
    echo "<div class='project-list-item'>";
        echo "<img src='$result[0]' class='project-list-image' alt='Blog Item Image'>";
        echo "<div class='project-heading'>".$row[1]."</div>";
        echo "<div class='project-subheading'>".$row[2]."</div>";
    echo "</div>";
}

Другим решением было бы снова выполнить тот же запрос ( ЧТО ТАКОЕ ПЛОХАЯ ПРАКТИКА ), если нет другого способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...