PHP:在'$ this'中使用'$ this'?

Nei*_*man 0 php mysql join class this

可能是一个新手问题,但我是自学成才的,我正在尝试编辑一些超出我的舒适区域的代码,并且不会出现问题.请帮忙!

它是一个从MySQL数据库中选择数据并返回数组的函数.它使用其他几个"核心"函数来帮助建立数据库连接.

原始脚本如下所示:

class Core{
    protected $db, $result;
    private $rows;

    public function __construct() {
        $this->db = new mysqli('localhost', 'root', 'password', 'db');
    }

    public function query($sql){
        $this->result = $this->db->query($sql);
    }

    public function rows(){
        for($x = 1; $x <= $this->db->affected_rows; $x++){
            $this->rows[] = $this->result->fetch_assoc();
        }
    return $this->rows;
    }
}

class Chat extends Core{
    public function fetchMessages(){
        $this->query("
            SELECT  `chat`.`message`,
                    `users`.`username`,
                    `users`.`user_id`
            FROM    `chat`
            JOIN    `users`
            ON      `chat`.`user_id` = `users`.`user_id`
            ORDER BY `chat`.`timestamp`
            DESC
        ");
        return $this->rows();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,在Chat类的fetchMessages()函数中有一个SELECT子句,它将"chat"表与"users"表连接起来以获取用户名.如果由于某种原因(删除,禁止,退出等),用户表中不存在用户ID,则SELECT子句不返回任何结果.

为了在用户不存在的情况下它仍然返回消息,我想我需要将JOIN分成2个SELECT CLAUSES:

  • 首先,SELECT message,user_idFROM chatORDER BY timestampDESC;

  • 然后,如果没有找到行,则SELECT usernameFROM usersWHERE user_id= $user_id并返回"Guest".

(我的脑子里有伪代码或逻辑,我只是​​无法编码!)

我的问题是,因为我使用$ this->表示法,我不知道如何在函数中包含第二个实例.我想做的是这样的:

public function fetchMessages(){
    $this->query("
        SELECT `message`, `user_id` FROM `chat` ORDER BY `chat`.`timestamp` DESC
    ");
    $rows = $this->rows();
    foreach ($rows as $row) {
        $uid = $row['user_id'];

        $this[2]->query("
            SELECT `username` FROM `users` WHERE `user_id` = `$uid`;
        ");
        $user = $this[2]->rows();

        if ( $user['username'] == "" ) {
            $username = "Guest";
        } else {
            $username = $user['username'];
        }
        $return_array[] = array($row['message'],$username);
    }
    return $return_array;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以理解我想要做什么,并重新编写我的伪代码,以便它不使用两个'$ this - >'并且实际上有效吗?

我真的很感激任何帮助......

Jon*_*Jon 6

你只需要JOIN users改为LEFT JOIN users.

您当前的代码执行a INNER JOIN,仅当两个表上都有要连接的行时才会生成结果行.A LEFT JOIN将生成左侧表中存在的所有行的结果,NULL当没有相应的行存在时,替换右侧表中的值.

在您的情况下,这意味着您将获取所有消息的行,即使其中某些消息没有相应的用户.

另请参见SQL连接的可视化说明.