PHP / MySQL,不理解这种特殊情况下的 foreach 循环。 [概念问]
PHP / MySQL, not understanding foreach loop in this particular case. [conceptual Q]
在我问我的问题之前,我会 post 代码:(请注意,如果你能解释第二个问题就足够了,我真的很困惑 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>
关于这段代码,我有几点不明白。
首先,class中的"this"是什么?它只是用户 object 的占位符,也就是当前的 object,对吧?我觉得是这样的。
其次,也是我的主要问题,当我们调用成员函数 showAllUsers() 时,我们转到 ViewUser class,然后我们有一个 $datas 变量被分配给$this->getAllUsers() 最终返回一个 $data 数组,其中包含数据库中的所有行...对吗?
那么我的问题是,foreach循环中$datas的内容是什么?它是一个行数组吗? $data 应该是键值,但 $data 也是一个让我很困惑的数组。
我将其可视化为 $datas = $data,所以
$datas[] = [$data[0], $data[1], $data[2], $data[3], ... $data[last_one]]
这些元素中的每一个都包含一行......
所以 foreach($datas as data) 遍历每个元素,但要显示它我们需要 echo data[0]?
我的理解正确吗?我知道这是一个关联数组,所以那些 0、1、2... 等是 table..
的列标题
- 此外,当我们有 $row = fetch_assoc 时,$fetch_assoc 究竟做了什么?我们只是将行存储在 $rows 变量中吗?当我们到达最后一行时,while 循环为假,对吗?我已经习惯在 while 循环中看到条件语句,例如 while (x == 4)。到目前为止,我从未见过我们分配变量的情况,例如 while (x = 4) 。
这对于 class 处理方案来说实际上很差,但你的问题仍然有效。
- 你说的有点对。
$this
是对 class 的当前实例(读取:对象)的引用,您在其中定义了使用 this
关键字的方法。
- 在所有情况下都是正确的。你也是对的,因为
datas
是一个数组数组(代表数据库中的行 table)。 $datas
的每个元素都包含另一个表示单行的数组,其中每个元素都是该行的一列。它们是关联数组,所以索引是一个键,就像你说的那样。
- 根据 the documentation,
mysqli::query
returns 类型的对象 mysqli_result
,因此您不能直接将其作为数组访问。 mysqli::fetch_assoc
将通过移动指针逐行将 mysqli_result
转换为关联数组,这就是为什么你一直在 while
循环中循环直到 fetch_assoc
returns false(即,当结果对象中没有更多行时,或者当指针到达最后一行时)。
在我问我的问题之前,我会 post 代码:(请注意,如果你能解释第二个问题就足够了,我真的很困惑 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>
关于这段代码,我有几点不明白。
首先,class中的"this"是什么?它只是用户 object 的占位符,也就是当前的 object,对吧?我觉得是这样的。
其次,也是我的主要问题,当我们调用成员函数 showAllUsers() 时,我们转到 ViewUser class,然后我们有一个 $datas 变量被分配给$this->getAllUsers() 最终返回一个 $data 数组,其中包含数据库中的所有行...对吗?
那么我的问题是,foreach循环中$datas的内容是什么?它是一个行数组吗? $data 应该是键值,但 $data 也是一个让我很困惑的数组。
我将其可视化为 $datas = $data,所以
$datas[] = [$data[0], $data[1], $data[2], $data[3], ... $data[last_one]]
这些元素中的每一个都包含一行......
所以 foreach($datas as data) 遍历每个元素,但要显示它我们需要 echo data[0]?
我的理解正确吗?我知道这是一个关联数组,所以那些 0、1、2... 等是 table..
- 此外,当我们有 $row = fetch_assoc 时,$fetch_assoc 究竟做了什么?我们只是将行存储在 $rows 变量中吗?当我们到达最后一行时,while 循环为假,对吗?我已经习惯在 while 循环中看到条件语句,例如 while (x == 4)。到目前为止,我从未见过我们分配变量的情况,例如 while (x = 4) 。
这对于 class 处理方案来说实际上很差,但你的问题仍然有效。
- 你说的有点对。
$this
是对 class 的当前实例(读取:对象)的引用,您在其中定义了使用this
关键字的方法。 - 在所有情况下都是正确的。你也是对的,因为
datas
是一个数组数组(代表数据库中的行 table)。$datas
的每个元素都包含另一个表示单行的数组,其中每个元素都是该行的一列。它们是关联数组,所以索引是一个键,就像你说的那样。 - 根据 the documentation,
mysqli::query
returns 类型的对象mysqli_result
,因此您不能直接将其作为数组访问。mysqli::fetch_assoc
将通过移动指针逐行将mysqli_result
转换为关联数组,这就是为什么你一直在while
循环中循环直到fetch_assoc
returns false(即,当结果对象中没有更多行时,或者当指针到达最后一行时)。