当在while循环中使用mysqli_fetch_array时,PHP/MySQL如何知道获取下一行


How does PHP/MySQL know to fetch the next row when using mysqli_fetch_array in a while loop?

以下是代码:

<?php
    $q = 'SELECT * FROM categories ORDER BY category'; 
    $r = mysqli_query($dbc,$q);
    while (list($id,$category) = mysqli_fetch_array($r,MYSQLI_NUM)) {
        echo '<li><a href="category.php?id=' . $id . '" title="' . $category . '">' . $category . '</a></li>';
    }
?>

看起来变量名$id和$category被分配给了通过循环的每次迭代从数据库中提取的一行。每次循环重新开始时,都会选择下一行我的问题是:如何知道在表中选择下一行

这不像是对行进行索引,因此"for"循环可以遍历表的所有行。有人能向我解释一下吗?

简单地说:因为它实现了可遍历性。只需在PHP网站上查找mysqli_result类定义即可。实际上,您也可以通过(正确地)实现Iterator来使用自己的类来实现这一点,Iterator将允许该类的对象以与mysqli_results相同的方式进行遍历。此外,如果你在页面上查看迭代器的示例,你会发现一个基本的模型,说明如何在mysqli_result之类的类中管理迭代器。

这是因为$r是一个对象,它包含有关最近读取行的信息。这也适用于流。把它想象成它有一个内部计数器,每次调用_fetch_array()_fetch_object()或类似的计数器时都会递增。

每次调用mysqli_fetch_array后,结果集的内部指针(在示例中由$r表示)都会增加,因此下一次调用返回下一个元素。

一旦没有更多的元素,则返回的结果为NULL。一旦返回NULL,While控制结构就会注意停止进程。

结果集基于MySQL查询的输出,不需要表示单个表。