PHP Дает бесконечное время L oop, когда mysqli_fetch_asso c Выражение заменяется только на переменную - PullRequest
1 голос
/ 26 апреля 2020

Я полный новичок ie в PHP, и я просто не понимаю, как while l oop работает с mysqli_fetch_assoc. Первые операторы execute основаны на выражениях, последние извлекают строку из базы данных. Так что, если вы не завершите l oop, он будет продолжать итерировать поле в первом ряду бесконечно;

<?php
$connect_db=mysqli_connect('localhost','root','root','db');
$fetch_data="SELECT * FROM tabel";
$query_db=mysqli_query($connect_db,$fetch_data);
$fetch_row=mysqli_fetch_assoc($query_db);
while($fetch_row){
    $column_2_array=$fetch_row['column_2'];
    echo($column_2_array);
    break;
}
?>

Я почесываю голову, если все выражение помещено внутрь вместо круглых скобок вместо l, l oop будет перебирать все содержимое столбца.

<?php
$connect_db=mysqli_connect('localhost','root','root','db');
$fetch_data="SELECT * FROM tabel";
$query_db=mysqli_query($connect_db,$fetch_data);
while($fetch_row=mysqli_fetch_assoc($query_db)){
    $column_2_array=$fetch_row['column_2'];
    echo($column_2_array);
}
?>

Почему во втором примере выше, после первого l oop, while выполняет итерацию последующих строк в выбранном столбце?

Уточняю свой вопрос, если я уберу break из первого примера, то в чем разница между примером 1 и 2? Это то, что смущает меня, так как я думал, что они идентичны.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

Чтобы понять, почему этот подход цикла mysqli_result работает с while l oop, вам нужно понять две вещи:

  • PHP использует жонглирование типа . Каждая строка, возвращаемая mysqli_fetch_assoc(), будет массивом. Можно с уверенностью предположить, что этот массив никогда не будет пустым, поэтому значение всегда будет приведено к true при использовании в логическом контексте.
  • mysqli_fetch_assoc() возвращает одну строку из результата и перемещает внутренний указатель на следующую строку. Когда указатель достигнет последней строки, каждый последующий вызов вернет NULL.

В то время как l oop эквивалентно:

$fetch_row = mysqli_fetch_assoc($query_db); // save the first row in the variable. It could also be false
while($fetch_row) { // as long as $fetch_row is not false-ish
    $column_2_array = $fetch_row['column_2'];
    echo $column_2_array;

    // fetch false or the next row
    $fetch_row = mysqli_fetch_assoc($query_db)
}

Стоит отметить, что такой подход зацикливание не рекомендуется. Намного проще использовать foreach l oop. Это будет l oop на всем наборе результатов один за другим от первого ряда до последнего. Вы можете l oop один и тот же mysqli_result объект несколько раз.

foreach($query_db as $fetch_row) {
    $column_2_array = $fetch_row['column_2'];
    echo $column_2_array;
}

Еще лучшей альтернативой является использование fetch_all(MYSQLI_ASSOC) и сохранение всех строк в многомерном массиве. И как всегда, используйте PDO вместо mysqli, когда это возможно.

1 голос
/ 26 апреля 2020

Самое простое объяснение:

Когда вы запускаете mysqli_query() Для успешных запросов SELECT, SHOW, DESCRIBE или EXPLAIN mysqli_query() вернет объект mysqli_result, который содержит данные из база данных.


  • mysqli_fetch_assoc() - извлекать строку результата (одну строку из объекта mysqli_result) как ассоциативный массив при каждом вызове и перемещении внутренний указатель на следующий. $fetch_row используется для хранения этого ассоциативного массива, содержащего данные одной строки, получаемые от объекта mysqli_result '

, который вы можете получить, чтобы данные принадлежали этому необработанному используя $fetch_row['column_name']

  • while l oop выполняет вызов mysqli_fetch_assoc() снова и снова. После извлечения одной строки она переходит к следующей и так далее, пока не достигнет конца объекта и вернет NULL, что означает false и breaks while l oop.

Итак, в вашем первом примере кода

$fetch_row=mysqli_fetch_assoc($query_db); вернется и назначит только одну строку данных для $fetch_row (тип данных - asso c. Array). Что делает состояние while l oop true.

...