1

我是 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 之间有什么区别?这让我感到困惑,因为我认为它们是相同的。

4

2 回答 2

3

要了解为什么这种循环 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)
}

值得注意的是,不建议使用这种循环方法。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。

于 2020-04-26T23:28:47.717 回答
1

最简单的解释是,

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


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

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

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

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

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

于 2020-04-26T14:19:28.767 回答