提问人:user3134685 提问时间:4/26/2020 最后编辑:Dharmanuser3134685 更新时间:4/27/2020 访问量:884
PHP 在表达式仅替换为变量时mysqli_fetch_assoc给出无限的 while 循环
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
进一步澄清我的问题,如果我从第一个例子中抽离出来,那么例子 1 和 2 有什么区别?这让我感到困惑,因为我认为它们是相同的。break
答:
最简单的解释是,
运行 mysqli_query()
时,如果成功,SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询将返回一个对象,其中包含数据库中的数据。mysqli_query()
mysqli_result
mysqli_fetch_assoc(
) - 每次调用结果行(从对象中获取一行)作为关联数组,并将内部指针移动到下一个。 用于存储包含从mysqli_result
对象获取的单行数据的关联数组mysqli_result
$fetch_row
'
您可以使用以下方法检索属于该原始数据的数据$fetch_row['column_name']
- 循环一遍又一遍地调用。获取一行后,它会转到下一行,依此类推,直到到达对象的末尾并返回 ,这意味着 和 循环。
while
mysqli_fetch_assoc()
NULL
false
breaks
while
因此,在您的第一个代码示例中,
$fetch_row=mysqli_fetch_assoc($query_db);
将返回并仅将一个数据行分配给 (Data Type- Assoc. Array)。这使得循环的条件 .$fetch_row
while
true
评论
while
break
$fetch_row
true
$fetch_row
mysqli_fetch_assoc
要理解为什么这种循环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;
}
更好的替代方法是在多维数组中使用和存储所有行。与往常一样,尽可能使用 PDO 而不是 mysqli。fetch_all(MYSQLI_ASSOC)
评论
mysqli_fetch_array()