#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 строки, и обе они отображаются.
Но всякий раз, когда я использую foreach() , он просто возвращает мне последний результат запроса.
$query = mysqli_query($conexion, "SELECT * FROM notas");
foreach(mysqli_fetch_assoc($query) as $valor){
var_dump($valor);
}
Есть ли какая-либо причина, почему? Я делаю что-то не так в цикле foreach()? Я действительно не могу сказать. Я бы просто сказал «fudge it», принял его и использовал только циклы while для отображения запросов, но, знаете, хочу знать, делал ли я что-то неправильно или чего-то не понимал.
Комментарии:
1. Смотрите mysqli_fetch_all . Это будет работать для вашего foreach . Причина
_fetch_assoc
не работает в том, что он возвращает только одну строку за раз и увеличивает внутренний указатель, поэтому при следующем вызове он извлекает следующую строку. Для aforeach
вам нужен массив или итератор2.
foreach($query
но вы должны использовать некоторые отчеты об ошибках, чтобы знать, что запрос выполнен успешно3. Использование
while( _fetch_assoc())
полезно, если вы работаете с огромным количеством строк и можете использовать слишком много памяти, если вы помещаете ВСЕ результаты в массив сразу.4. Кроме того, я лично рекомендую использовать
PDO
overmysqli
. Я всегда считал его более простым в использовании, и мне нравится его 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: