在我问问题之前,我将发布代码:(请注意,如果你能解释第二个问题就足够了,我只是真的很困惑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>
我对这段代码有几点不懂。
首先,这些课程中的“这”是什么?它只是用户对象的占位符,即当前对象,对吗?我想是的。
其次,也是我的主要问题,当我们调用成员函数showallusers()时,我们转到viewuser类,然后我们有一个$datas变量被分配给$this->getallusers(),它最终返回一个$data数组,其中包含数据库中的所有行。。。正确的?
那么我的问题是,foreach循环中$datas的内容是什么?它是一个行数组吗$data应该是键值,但是$data也是一个数组,这让我非常困惑。
我将其可视化为$datas=$data,所以$datas[]=[$data[0],$data[1],$data[2],$data[3]$数据[最后一个]]并且这些元素中的每一个都包含一行。。。所以foreach($datas as data)遍历每个元素,但要显示它,我们需要回显数据[0]?
我的理解正确吗?我知道这是一个关联数组,所以那些0,1,2。。。etc是表的列标题。。
另外,当我们有$row=fetch\u assoc时,$fetch\u assoc到底做了什么?我们只是在$rows变量中存储行吗?当我们到达最后一行时while循环是假的,对吗?我只是习惯于在while循环中看到一个条件,比如while(x==4)。我从来没有见过我们分配变量的情况,比如while(x=4),直到现在。
1条答案
按热度按时间relj7zay1#
对于类处理方案来说,这实际上是相当糟糕的,但是您的问题仍然有效。
你说得有点对。
$this
是对类的当前示例(read:object)的引用,在该类中定义使用this
关键字。在任何情况下都是正确的。你说得对
datas
是一个数组数组(表示数据库表中的行)。每个元素$datas
包含另一个表示单行的数组,其中每个元素都是该行的一列。它们是关联数组,所以索引是一个键,就像你说的。根据文件,
mysqli::query
返回类型为的对象mysqli_result
,因此不能直接作为数组访问它。mysqli::fetch_assoc
将转换mysqli_result
一行一行地移动指针,这就是为什么在while
循环直到fetch_assoc
返回false(即,当结果对象中没有更多行时,或当指针到达最后一行时)。