PHP避免使用带有PDO连接的全局$数据库

PHP避免使用带有PDO连接的全局$数据库,php,pdo,global,Php,Pdo,Global,我有下面的代码。我想要的是避免使用global$db,因为我听说这是一种不好的做法,我正在寻找更健壮/实现更好的功能 connection.php <?php try { $db = new PDO('mysql:host=127.0.0.1;dbname=blop', 'blop', 'root'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (Exception $e

我有下面的代码。我想要的是避免使用global$db,因为我听说这是一种不好的做法,我正在寻找更健壮/实现更好的功能

connection.php

<?php
try {
    $db = new PDO('mysql:host=127.0.0.1;dbname=blop', 'blop', 'root');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (Exception $e) {
    $error = $e->getMessage();
    echo $error;
}
?>

Admin.php

<?php
class Admin {

    public function fetch_data() {
        global $db;

        $sql = "SELECT * FROM `people` ORDER BY `id` DESC";
        $result = $db->query($sql);

        return $result;
    }

    public function fetch_row_count() {
        global $db;

        $sql = "SELECT * FROM `people`";
        $result = $db->query($sql);
        $num_rows = $result->rowCount();

        return $num_rows;
    }

    public function deleteAll() {
        global $db;

        $deleteAll = $db->prepare("DELETE FROM `people`");
        $deleteAll->execute();
    }

    public function deleteData($id) {
        global $db;

        $id = $_POST['id'];
        $deleteData = $db->prepare("DELETE FROM `people` WHERE `id` = '$id'");
        $deleteData->execute();
    }
}
?>
引入依赖项注入:


很简单,真的。只需显式地将所有外部依赖项传递给需要它的类。

依赖项注入是指将类需要的所有依赖项传递给类,在本例中是PDO。下面是一个例子,使用构造函数注入(我们将数据库传递到构造函数中)在您的案例中如何工作。当实例化对象时,您需要这样做
$admin=newadmin($db)
而不是
$admin=new admin()

还要注意,在方法
deleteData
中,行
$id=$\u POST['id']
应该被删除,因为它不仅使用了另一个依赖项(post请求),而且还覆盖了传递给方法的$id,使得方法签名毫无意义

希望这有帮助

class Admin {

    protected $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function fetch_data() {

        $sql = "SELECT * FROM `people` ORDER BY `id` DESC";
        $result = $this->db->query($sql);

        return $result;
    }

    public function fetch_row_count() {

        $sql = "SELECT * FROM `people`";
        $result = $this->db->query($sql);
        $num_rows = $result->rowCount();

        return $num_rows;
    }

    public function deleteAll() {

        $deleteAll = $this->db->prepare("DELETE FROM `people`");
        $deleteAll->execute();
    }

    public function deleteData($id) {

        $deleteData = $this->db->prepare("DELETE FROM `people` WHERE `id` = '$id'");
        $deleteData->execute();
    }
}

你听说过依赖注入吗?我听说过,但不是很了解它,但它给了我这个错误:“可捕获的致命错误:传递给管理员的参数1::_construct()必须是PDO的实例,没有给定,在/va中调用…”在实例化它的代码中定义了$db吗?另外,我假设没有名称空间(在这种情况下应该是
\PDO
),您可能也需要将$db放入实例化管理员的代码中。。。同样,这将通过依赖项注入完成。。。您可以尝试在新管理员($db)
之前使用一个
global$db
来测试该类是否工作,但是您应该重构代码以摆脱该全局设置……非常感谢,它工作了。。。顺便问一下,如何调用loggedin.php中的函数?我有“$adminLisa=new Admin($db).$adminLisa->fetch_data();”但它不起作用。。。不是错误,但不显示任何结果。更改
返回$result
to
return$result->fetchAll()
返回$result->fetchAll(PDO::FETCH_ASSOC)
将它们作为关联数组。这在
获取数据方法中。非常感谢,但是。。。“可捕获的致命错误:传递给管理员的参数1::_construct()必须是PDO的实例,未给定,在/va…中调用。”因为您没有将
PDO
实例传递给构造函数!?!
class Admin {

    protected $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function fetch_data() {

        $sql = "SELECT * FROM `people` ORDER BY `id` DESC";
        $result = $this->db->query($sql);

        return $result;
    }

    public function fetch_row_count() {

        $sql = "SELECT * FROM `people`";
        $result = $this->db->query($sql);
        $num_rows = $result->rowCount();

        return $num_rows;
    }

    public function deleteAll() {

        $deleteAll = $this->db->prepare("DELETE FROM `people`");
        $deleteAll->execute();
    }

    public function deleteData($id) {

        $deleteData = $this->db->prepare("DELETE FROM `people` WHERE `id` = '$id'");
        $deleteData->execute();
    }
}