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
,这意味着 false
和 breaks
while
循环。
所以在你的第一个代码示例中,
$fetch_row=mysqli_fetch_assoc($query_db);
将 return 并仅分配一个数据行给 $fetch_row
(数据类型 - 关联数组)。这使得 while
循环的条件成为 true
。
要理解为什么这种循环方法 mysqli_result 适用于 while
循环,您需要了解两件事:
- PHP 使用 type juggling。
mysqli_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。
我是 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()
。获取一行后,它会转到下一行,依此类推,直到到达对象的末尾 returnsNULL
,这意味着false
和breaks
while
循环。
所以在你的第一个代码示例中,
$fetch_row=mysqli_fetch_assoc($query_db);
将 return 并仅分配一个数据行给 $fetch_row
(数据类型 - 关联数组)。这使得 while
循环的条件成为 true
。
要理解为什么这种循环方法 mysqli_result 适用于 while
循环,您需要了解两件事:
- PHP 使用 type juggling。
mysqli_fetch_assoc()
编辑的每一行 return 都是一个数组。可以安全地假设此数组永远不会为空,因此在布尔上下文中使用时,该值将始终转换为true
。 mysqli_fetch_assoc()
return 从结果中取出一行并将内部指针移动到下一行。当指针到达最后一行时,每个后续调用将 returnNULL
.
这个 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。