PHP如何遍历mysqli查询结果?

时间:2018-11-02 19:06:05

标签: php mysqli

我正在学习与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]的东西?

1 个答案:

答案 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,从而终止循环。