Как PHP перебирает результаты запроса mysqli? - PullRequest
0 голосов
/ 02 ноября 2018

Я учусь взаимодействовать с базой данных на 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 голосов
/ 02 ноября 2018

Запрос возвращает mysqli_result. Согласно документам, этот объект является итеративным http://php.net/manual/en/class.mysqli-result.php. Таким образом, каждый раз, когда вы вызываете fetch_array(), объект результата отслеживает, в какой строке он находится в данный момент, и возвращает соответствующий результат, затем перемещается на один элемент вперед в набор результатов. Когда результатов больше не осталось, функция возвращает null, который оценивается как false, что завершает цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...