2

这是代码:

<?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”循环可以遍历表的所有行。谁可以给我解释一下这个?

4

3 回答 3

2

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

于 2013-08-26T02:45:56.743 回答
0

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

于 2013-08-26T02:43:04.027 回答
0

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

一旦没有更多元素,返回的结果为 NULL。While控制结构会在返回 NULL 后立即停止进程。

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

于 2013-08-26T02:46:16.283 回答