php использует while дважды

#php #mysqli

#php #mysqli

Вопрос:

В настоящее время я новичок в php и учусь, но после небольшого тестирования я знаю, что while его нельзя использовать дважды, но я не уверен, как его точно сбросить.
Я вижу, что в некоторых сценариях люди используют reset($variable) , но, похоже, в моем случае это не работает.
В случае, если это имеет значение, я пытаюсь использовать mysqli для возврата выпадающего меню в качестве выбора, первое работает, но второе не работает вообще.

     <?php 
                    echo '<select>';
                    while(list($stateID, $stateName) = $result->fetch_row())
                    {   
                echo '<option value="$stateName">';
                echo "$stateName";
                echo '</option>';
                    } 
                    echo '</select>';
                    ?>
                <br>
                <br>
                To: amp;nbsp; amp;nbsp;
            <?php 
                 echo '<select>';
                    while(list($stateID, $stateName) = $result2->fetch_row())
                    {   
                echo '<option value="$stateName">';
                echo "$stateName";
                echo '</option>';
                    }
            echo '</select>';
                    ?>
 

кроме того, на случай, если это необходимо, вот мои результаты поиска в mysql.

     <?php
include 'connect.php';
$query = "SELECT * FROM LOCATION";
$result = $mysqli->query($query, MYSQLI_STORE_RESULT);
$result2 = $mysqli->query($query, MYSQLI_STORE_RESULT);
if(!$result) {
    echo($mysqli->error);
    exit();
}
?>
 

Хотя этот метод работает, когда я создал 2 переменные с результатами 1 и 2, но у меня такое чувство, что это неправильный путь, особенно в том случае, если мне нужно повторно использовать один и тот же код снова и снова.

Ответ №1:

То, что вы делаете в этих while операторах, — это переход по списку строк, полученных из базы данных. Это правда, что вы не можете выполнить итерацию по списку дважды *, поэтому вы можете попробовать что-то другое: выполнить итерацию по списку один раз и сохранить результаты, чтобы их можно было использовать повторно. Например:

Сделайте это после запроса к базе данных:

 $data = [];
while(list($stateID, $stateName) = $result->fetch_row())
{   
    $data[] = [ 'stateID' => $stateID, 'stateName' => $stateName ];
}
 

Все, что я здесь сделал, это повторил список строк и сохранил данные в переменной. Теперь вы можете использовать переменную вместо того, чтобы пытаться получить доступ к результатам MySQL:

 echo '<select>';
foreach ($data as $d) {
    echo '<option value="'.$d['stateName'].'">";
    echo $d['stateName'];
    echo '</option>';
}
 

И поскольку данные хранятся в массиве, вы можете использовать его столько раз, сколько захотите.

* Возможно, можно сбросить указатель на результирующий набор MySQL, но мой подход проще и (вероятно) работает немного лучше, поскольку вы скопировали нужные данные в обычный старый массив PHP