PHP / MySQL, не понимая цикл foreach в данном конкретном случае.[концептуальный вопрос] - PullRequest
0 голосов
/ 31 мая 2018

Прежде чем задать свой вопрос, я опубликую код: (Обратите внимание, что если вы можете просто объяснить второй вопрос, этого будет достаточно, я просто очень запутался, что происходит в цикле foreach.

<?php
class dbh {
    private $servername; private $username; private $password; private $ 
    dbname;
    protected function connect() {
    $this->servername = "localhost";
    $this->username = "root";
    $this->password = "";
    $this->dbname = "whatever";

    $conn = new mysqli($this->servername, $this->username, $this->password, 
$this->dbname);
    return $conn;
    }
}

<?php
class User extends Dbh {
    protected function getAllUsers() {
        $sql = "SELECT * FROM user";
        $result = $this->connect()->query($sql);
        $numRows = $result->num_rows;
        if($numRows > 0) {
           while($row = $result ->fetch_assoc()) {
               $data[] = $row;
           }
           return $data;
        }
    }
}

<?php
class ViewUser extends User {
   public function showAllUsers() {
      $datas = $this->getAllUsers();
      foreach ($datas as $data) {
         echo $data['uid'] . "<br>";
         echo $data['pwd'] . "<br>";
      }
   }
}

<?php
    includes all those classes
?>

<body>
<?php
    $users = new ViewUser();
    $users->showAllUsers();
?>
</body>

Я не понимаю пару вещей об этом коде.

  1. Во-первых, что такое "это" в этих классах? Это просто заполнитель для объекта users, которыйтекущий объект, верно? Я думаю, что это так.

  2. Во-вторых, и мой главный вопрос, когда мы вызываем функцию-член showAllUsers (), мы переходим к классу ViewUser, а затемиметь переменную $ datas, которая присваивается $ this-> getAllUsers (), которая в итоге возвращает массив $ data, который содержит все строки в базе данных ... Верно?

Тогда у меня вопрос: каково содержание $ datas в цикле foreach? Это массив строк? Предполагается, что $ data - это ключевые значения, но $ data - это тоже массив, который меня очень смущает.

Я визуализирую это как $ datas =$ data, поэтому $ datas [] = [$ data [0], $ data [1], $ data [2], $ data [3], ... $ data [last_one]], и каждый из этих элементов содержитстрока ... Итак, foreach ($ datas как данные) проходит через каждый элемент, но для его отображения нам нужно отобразить данные [0]?
Верно ли мое понимание?Я знаю, что это ассоциативный массив, поэтому эти 0, 1, 2 ... и т. Д. Являются заголовками столбцов таблицы ..

Кроме того, что именно делает $ fetch_assoc, когда у нас есть $ row = fetch_assoc?Мы просто храним строки в переменной $ row?Цикл while ложен, когда мы достигаем последнего ряда, верно?Я просто привык видеть условие в цикле while, как, например, while (x == 4).Я никогда не видел ситуации, когда мы назначаем переменную, как, например, while (x = 4), до сих пор.

1 Ответ

0 голосов
/ 31 мая 2018

Это на самом деле довольно плохо для схемы обработки классов, но ваши вопросы все еще актуальны.

  1. Вы вроде как правы.$this является ссылкой на текущий экземпляр (читай: объект) класса, в котором вы определяете метод, использующий ключевое слово this.
  2. Правильно во всех случаях.Вы также правы в том, что datas - это массив массивов (который представляет строки в таблице базы данных).Каждый элемент $datas содержит другой массив, представляющий одну строку, где каждый элемент является столбцом этой строки.Они являются ассоциативными массивами, поэтому индекс является ключом, как вы сказали.
  3. Согласно документация , mysqli::query возвращает объект типа mysqli_result, поэтому вы не можетеобращаться к нему напрямую как к массиву.mysqli::fetch_assoc преобразует mysqli_result в ассоциативный массив, строка за строкой, перемещая указатель, поэтому вы продолжаете цикл в цикле while, пока fetch_assoc не вернет false (то есть, когда больше строк не будет вобъект результата или когда указатель достигает последней строки).
...