PHP / MySQL,在这种特殊情况下不理解foreach循环.[概念 Q]



在我提出问题之前,我将发布代码: (请注意,如果您可以解释第二个问题就足够了,我真的很困惑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. 首先,这些类中的"这个"是什么? 它只是用户对象的占位符,这是当前对象,对吧? 我认为是的。

  2. 其次,也是我的主要问题,当我们调用成员函数 showAllUsers(( 时,我们转到 ViewUser 类,然后我们有一个分配给 $this->getAllUsers(( 的$datas变量,它最终返回一个 $data 数组,其中包含数据库中的所有行...... 右?

那么我的问题是,foreach 循环中$datas的内容是什么? 它是一个行数组吗? $data应该是键值,但$data也是一个让我非常困惑的数组。

我把它想象成$datas = $data,所以 $datas[] = [$data[0], $data[1], $data[2], $data[3], ... $data[last_one]] 这些元素中的每一个都包含一行... 所以foreach($datas作为数据(遍历每个元素,但要显示它,我们需要回显数据[0]?
我的理解正确吗? 我知道这是一个关联数组,所以那些 0、1、2...等是表格的列标题。

  1. 另外,当我们有$row = fetch_assoc时,$fetch_assoc 到底做了什么? 我们只是将行存储在$rows变量中吗? 当我们到达最后一行时,while 循环是假的,对吧? 我只是习惯于在 while 循环中看到条件,例如 while (x == 4(。 到目前为止,我从未见过我们分配变量的情况,例如 while (x = 4(。

对于类处理方案来说,这实际上是很差的,但你的问题仍然有效。

  1. 你是对的。$this是对类的当前实例(read: 对象(的引用,在该类中定义使用this关键字的方法。
  2. 在所有情况下都正确。您也没错,datas是一个数组数组(表示数据库表中的行(。$datas的每个元素都包含另一个表示单个行的数组,其中每个元素都是该行的一列。它们是关联数组,所以索引是一个键,就像你说的。
  3. 根据文档,mysqli::query返回一个类型为mysqli_result的对象,因此您无法直接将其作为数组访问。mysqli::fetch_assoc将通过移动指针将mysqli_result逐行转换为关联数组,这就是您不断在while循环中循环的原因,直到fetch_assoc返回 false(即,当结果对象中没有更多行时,或者当指针到达最后一行时(。

最新更新