将$ mysqli设置为OOP的全局变量

时间:2017-02-03 19:41:21

标签: php mysql oop mysqli

确定, 这是一个涉及的问题,但任何帮助或建议将非常感激。

所以我正在使用一个网站(使用.htaccess)将所有流量重定向到load.php。对于任何sql功能,我有一个抽象类,它有很多查询语句作为传递参数来定义每个查询的细节的函数。

e.g。 $表 - >更新( “限制”)

我正在尝试弄清楚如何在load.php上设置与数据库的连接,然后将连接设置为变量($mysqli),然后可以在我的抽象查询类中引用无需将参数传递给每个查询函数调用。

再次,任何帮助或建议将不胜感激。

以下是一个函数示例:

 function clearTable (){
    $mysqli = dbConnect::connect();
    $sql = "TRUNCATE TABLE $this->tablename";
    $mysqli->query($sql);

}

如果我在构造函数中连接到数据库并设置$this->mysqli并将$mysqli = dbConnect::connect();替换为$mysqli = $this->mysqli,则所有查询都不起作用。虽然他们在每次通话时都重新连接。

2 个答案:

答案 0 :(得分:2)

您应该使用依赖注入。

基本上它意味着需要数据库连接的类不会创建连接,它只接收已经实例化的实例。

实施例

在某些初始文件中:

// Create the db connection
$db = new Mysqli(......);

// Pass it to the query class that needs it
$queryClass = new QueryClass($db);

然后在你的班级档案中:

class QueryClass
{
    protected $db;

    public function __construct($db)
    {
        // $this->db will now be the same Mysql instance
        $this->db = $db;
    }

    public function doSomeQuery()
    {
        $this->db->query(....);
    }
}

如果你想开始进行一些单元测试,那么你可以不需要触摸QueryClass。您只需要将数据库连接传递给测试数据库。

答案 1 :(得分:0)

仔细研究一下后,我还可以创建我的db::connect()函数,如下所示:

class dbConnect {
    private static $db;
    private $mysqli;
    private function __construct() {
        $this->mysqli = new mysqli(HOST, USER, PASSWORD, DATABASE);
    }
    function __destruct() {
        $this->mysqli->close();
    }
    public static function connect() {
        if (self::$db == null) {
            self::$db = new dbConnect();
        }
        return self::$db->mysqli;
    }
} 

并将其作为$this->mysqli传递给查询函数文件