Результат отображения запроса с помощью while() или foreach()

#php #mysqli

#php #mysqli

Вопрос:

Я возился с тем, как выполнять запросы из MySQL и показывать их на PHP, и я наткнулся на кое-что:

Это таблица, к которой я делаю запрос:
Это таблица, к которой я выполняю запрос

 $query = mysqli_query($conexion, "SELECT * FROM notas");

while($nota = mysqli_fetch_assoc($query)){
    var_dump($nota);
    echo $nota["Descripcion"];
}
 

Всякий раз, когда я использую while() для отображения всех результатов запроса, это работает. В этой таблице есть 2 строки, и обе они отображаются.

Результат var_dump($notas):
Результат var_dump($notas)

Но всякий раз, когда я использую foreach() , он просто возвращает мне последний результат запроса.

 $query = mysqli_query($conexion, "SELECT * FROM notas");

foreach(mysqli_fetch_assoc($query) as $valor){
    var_dump($valor);
}
 

Результат var_dump($valor):
Результат var_dump($valor)

Есть ли какая-либо причина, почему? Я делаю что-то не так в цикле foreach()? Я действительно не могу сказать. Я бы просто сказал «fudge it», принял его и использовал только циклы while для отображения запросов, но, знаете, хочу знать, делал ли я что-то неправильно или чего-то не понимал.

Комментарии:

1. Смотрите mysqli_fetch_all . Это будет работать для вашего foreach . Причина _fetch_assoc не работает в том, что он возвращает только одну строку за раз и увеличивает внутренний указатель, поэтому при следующем вызове он извлекает следующую строку. Для a foreach вам нужен массив или итератор

2. foreach($query но вы должны использовать некоторые отчеты об ошибках, чтобы знать, что запрос выполнен успешно

3. Использование while( _fetch_assoc()) полезно, если вы работаете с огромным количеством строк и можете использовать слишком много памяти, если вы помещаете ВСЕ результаты в массив сразу.

4. Кроме того, я лично рекомендую использовать PDO over mysqli . Я всегда считал его более простым в использовании, и мне нравится его api для привязки параметров. Но это также не критический переключатель, поэтому не позволяйте моей рекомендации отвлекать вас от того, чего вы пытаетесь достичь. Я просто думаю, что это лучший опыт разработчика.

5. @Reed Я вижу. Используется _fetch_all , и это действительно сработало, var_dump теперь возвращены две строки, которые я ожидал. Я буду иметь в виду, что вы говорите о строках и PDO (еще не использовал его, поэтому мог бы также изучить его). Спасибо c:

Ответ №1:

Вторая версия перебирает столбцы, а не строки. Это эквивалентно:

 $row = mysqli_fetch_assoc($query);
foreach ($row as $valor) {
    var_dump($valor);
}
 

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

foreach (<expression> as <variable>) не переоценивает выражение каждый раз в цикле. Он выполняет его один раз, сохраняет этот массив, затем перебирает элементы массива.

mysqli_result Объект является итеративным, поэтому вы можете сделать:

 foreach($query as $valor) {
    var_dump($valor);
}
 

Вы также можете вызвать mysqli_fetch_all($query) , который вернет 2-мерный массив всех результатов, а затем выполнить цикл. Но если запрос возвращает много результатов, это займет много памяти.

Комментарии:

1. Я понимаю. Не очень хорошо понял, как fetch_assoc fetch_all работает и. Кроме того, никогда не пробовал использовать mysqli_result для обработки результатов запроса, мог бы также попробовать посмотреть, как это происходит. Спасибо c: