PHP 当 mysqli_fetch_assoc 表达式仅替换为一个变量时给出无限循环

PHP Gives Infinite While Loop when mysqli_fetch_assoc Expression is Replaced with just a Variable

我是 PHP 的新手,我只是不明白 while 循环如何与 mysqli_fetch_assoc 一起工作。前者根据表达式执行语句,后者从数据库中检索一行。所以如果你不结束循环,它会继续无限迭代第一行的字段;

<?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;
}
?>

让我摸不着头脑的是,如果整个表达式都放在括号内而不仅仅是变量,那么循环将迭代该列的全部内容。

<?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);
}
?>

为什么在上面的第二个示例中,在第一个循环之后,while 正在迭代所选列上的后续行?

进一步澄清我的问题,如果我从第一个示例中删除 break,那么示例 1 和示例 2 之间有什么区别?这让我感到困惑,因为我认为它们是相同的。

最简单的解释是,

当你 运行 mysqli_query() 对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询时 mysqli_query() 将 return 一个 mysqli_result 对象包含来自数据库的数据。


  • mysqli_fetch_assoc() - 在每次调用时获取结果行(来自 mysqli_result 对象的一行)作为关联数组并将内部指针移动到下一个。 $fetch_row 用于存储包含 来自 mysqli_result 对象的单行数据的关联数组 '

您可以使用 $fetch_row['column_name']

检索属于该原始数据的数据
  • while 循环一遍又一遍地调用 mysqli_fetch_assoc()。获取一行后,它会转到下一行,依此类推,直到到达对象的末尾 returns NULL,这意味着 falsebreaks while循环。

所以在你的第一个代码示例中,

$fetch_row=mysqli_fetch_assoc($query_db); 将 return 并仅分配一个数据行给 $fetch_row(数据类型 - 关联数组)。这使得 while 循环的条件成为 true

要理解为什么这种循环方法 mysqli_result 适用于 while 循环,您需要了解两件事:

  • PHP 使用 type jugglingmysqli_fetch_assoc() 编辑的每一行 return 都是一个数组。可以安全地假设此数组永远不会为空,因此在布尔上下文中使用时,该值将始终转换为 true
  • mysqli_fetch_assoc() return 从结果中取出一行并将内部指针移动到下一行。当指针到达最后一行时,每个后续调用将 return NULL.

这个 while 循环等同于:

$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 循环要容易得多。这将从第一行到最后一行逐个循环整个结果集。您可以多次循环相同的 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。