我正在学习与PHP中的数据库进行交互。下面的代码有效,但我不了解循环如何通过$result
进行迭代。
<?php
require_once('./login.php');
$conn = new mysqli($hn, $un, $pw, $db);
if ($conn->connect_error) die("DIED: CONNECTION FAILED.");
$query= "SELECT * FROM table1";
$result = $conn->query($query);
if (!$result) die("DIED: QUERY FAILED.");
while ($row = $result->fetch_array(MYSQLI_ASSOC)) {
$who = $row['WHO'];
$what = $row['WHAT'];
echo <<<_END
WHO: $who<br>
WHAT: $what<br>
_END;
}
$result->close();
$conn->close();
?>
我了解到,尽管$result
元素可用,但将其分配给$row
并在循环中进行处理。但是,解释器如何知道要移至下一个$result
元素?
当甚至使用for循环时,代码甚至可以工作,例如...
$row_count = $result->num_rows;
for($j = 0; $j < $row_count; $j++) {
$row = $result -> fetch_array(MYSQLI_ASSOC);
我的问题可以归结为:解释器如何知道使用$result
中的下一个元素而不需要类似$result[$j]
的东西?
答案 0 :(得分:1)
查询返回一个func takeLetter() {
for {
char, _, err := keyboard.GetSingleKey()
if err != nil {
panic(err)
}
fmt.Printf("%c", char)
}
}
func Print() {
for {
fmt.Println("snake is moving")
time.Sleep(1 * time.Second)
}
}
func main() {
go takeLetter()
go Print()
select {} // keep main from exiting immediately
}
。根据文档,此对象是可迭代的http://php.net/manual/en/class.mysqli-result.php。因此,每次调用mysqli_result
时,结果对象都会跟踪它当前在哪一行并返回适当的结果,然后向前移动结果集中的一个元素。如果没有更多结果可用,该函数将返回fetch_array()
并被评估为null
,从而终止循环。