PHP 在表达式仅替换为变量时mysqli_fetch_assoc给出无限的 while 循环

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

提问人:user3134685 提问时间:4/26/2020 最后编辑:Dharmanuser3134685 更新时间:4/27/2020 访问量:884

问:

我是PHP的新手,我只是不明白循环是如何工作的。前者基于表达式执行语句,后者从数据库中检索一行。所以如果你不结束循环,它将继续无限地迭代第一行的字段;whilemysqli_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

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

php while-loop mysqli

评论

0赞 afghanimah 4/26/2020
在 PHP 中,非空数组的计算结果为 true
0赞 Mayur Fartade 4/26/2020
为什么要使用循环来显示单行。如果要显示多行,请使用 within 循环mysqli_fetch_array()
0赞 user3134685 4/26/2020
我需要了解为什么在第二个示例中,循环显示所选列上的所有行,而不是像第一个示例那样仅显示第一行。

答:

1赞 Avishka Dambawinna 4/26/2020 #1

最简单的解释是,

运行 mysqli_query() 时,如果成功,SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询将返回一个对象,其中包含数据库中的数据。mysqli_query()mysqli_result


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

您可以使用以下方法检索属于该原始数据的数据$fetch_row['column_name']

  • 循环一遍又一遍地调用。获取一行后,它会转到下一行,依此类推,直到到达对象的末尾并返回 ,这意味着 和 循环。whilemysqli_fetch_assoc()NULLfalsebreakswhile

因此,在您的第一个代码示例中,

$fetch_row=mysqli_fetch_assoc($query_db);将返回并仅将一个数据行分配给 (Data Type- Assoc. Array)。这使得循环的条件 .$fetch_rowwhiletrue

评论

0赞 user3134685 4/27/2020
我不明白的是,为什么循环会在第二个示例中移动到下一行?第一个例子和第二个例子有什么区别?while
0赞 user3134685 4/27/2020
我已经编辑了我的问题以进一步澄清我的问题。如果我从第一个例子中抽离出来,那么例子 1 和 2 有什么区别?这让我感到困惑,因为我认为它们是相同的。break
0赞 Avishka Dambawinna 4/27/2020
第一个代码不会获取表中的所有数据。因为只有一个 raw(表中的第一个 raw)分配给它,而不是遍历行。数组不为空,表示状态。但是在第二个代码中,它将遍历表中的每一行并将其分配给变量 。$fetch_rowtrue$fetch_row
0赞 user3134685 4/27/2020
我想我现在明白了。 将单行作为表达式拉取,或将整行作为循环中的条件进行迭代。mysqli_fetch_assoc
0赞 Avishka Dambawinna 4/27/2020
@user3134685 答案中提供的示例只是一个解释。这不是它的实际工作方式。
3赞 Dharman 4/27/2020 #2

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

  • PHP 使用类型杂耍。返回的每一行都将是一个数组。可以肯定的是,此数组永远不会为空,因此在布尔上下文中使用时,该值将始终被强制转换为。mysqli_fetch_assoc()true
  • mysqli_fetch_assoc()从结果中返回一行,并将内部指针移动到下一行。当指针到达最后一行时,每个后续调用都将返回 。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)
}

值得注意的是,不推荐使用这种循环方法。使用循环要容易得多。这将从第一行到最后一行逐个循环整个结果集。您可以多次循环同一个对象。foreachmysqli_result

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

更好的替代方法是在多维数组中使用和存储所有行。与往常一样,尽可能使用 PDO 而不是 mysqli。fetch_all(MYSQLI_ASSOC)

评论

0赞 user3134685 4/27/2020
这真的很有帮助!我想在教程中(这个例子来自这个例子)为什么不使用 foreach,但我不知道该怎么做,直到你向我展示它。