这可能是一个愚蠢的初学者问题,我不认为它仅限于mysqli_fetch_assoc(),所以它可能是一个通用的编程问题。
无论如何,我有这个PHP代码,可以使用mysqli从数据库获取数据
$sql = "SELECT name FROM table1";
$result = mysqli_query($conn, $sql);
if($result){
if(mysqli_num_rows($result) > 0){
while($row = mysqli_fetch_assoc($result)){
echo "Name: " . $row["name"]. "<br>";
}
}
}
我不明白的是那里的while循环是如何工作的。如何迭代到下一个元素并知道何时结束? mysqli_fetch_assoc()返回一个关联数组,该数组存储在行变量中,这意味着它不为null,因此为true,让while循环运行。我不明白的是它如何遍历行并在没有更多行时结束。我没有做任何特别的事情来将行更改为下一行,那么它如何独自完成呢?
还mysqli_fetch_assoc()返回一个关联数组,因此“名称”键不应该包含1个元素吗?还是该列中所有行的数组?
(希望您能理解我想说的话,我不是最擅长解释.-。)
编辑:我不了解的是这段代码如何遍历所有行。它是此功能中“内置代码”的一部分吗? (我在任何地方都找不到它可以确认)
答案 0 :(得分:1)
最终,当mysqli_fetch_assoc($result)
用完行时,它将返回NULL,其结果为false,这会跳出循环。
$row
在数据库中产生一行,因此$row['name']
将是特定行的'名称'的值。
让我们对其进行分解,也许是一个关于其内部工作方式的简明示例(请注意,这会更加有效,并且实际上不会运行多个查询):
$result = ['currentRow' => 0, 'query' => 'SELECT name FROM table1'];
while ($row = mysqli_fetch_result($result)) {
}
//First iteration
mysqli_fetch_result queries 'SELECT name FROM table1 LIMIT 0, 1'
it increments internally $result['currentRow'] to 1
it returns the row that was found
//Second iteration
mysqli_fetch_result queries 'SELECT name FROM table1 LIMIT 1, 1'
it increments internally $result['currentRow'] to 2
it returns the row that was found
//Third iteration
mysqli_fetch_result queries 'SELECT name FROM table1 LIMIT 2, 1'
no rows returned! Just simply return null (This will cause your while loop to break out)
答案 1 :(得分:1)
每次
mysqli_fetch_assoc($result)
被访问后,指针将移至下一条记录。最后,当没有找到记录时,它返回 null
,这打破了while
的条件。
答案 2 :(得分:0)
您始终将$result
作为参数传递给mysqli_fetch_assoc
。此参数包含迭代器信息,每次您调用此函数到下一行时,mysqli_fetch_assoc
将使用该信息进行迭代。
在每次迭代期间,$row['name']
将是一个字符串。