如何在其他类中使用数据库连接

How to use database connection in other classes

PHP 编程对我来说很新 - 所以我希望我不要问一些愚蠢的问题。但是,我找不到任何问题的答案:-(

我已将我的数据库连接保存在一个单独的 .php 文件中。假设 "connection.inc.php"

connection.inc.php 看起来如下:

$host   = "name.server.com";
$dbname = "foo";
$user   = "bar";
$pass   = "PaSW0rd";

try
{
    $DBH = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass,
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

}
catch(PDOException $e)
{
   ...
}

在我的 index.php 中,我会将 connection.inc.php 包含在 'include_once "connection.inc.php"

此外,我有一个名为 house.class.php 的 class,其中我有一个方法 SQL 查询我的数据库。我通过 index.php

中的 'getColor($id, $DBH)' 调用该方法

有没有什么方法可以在不总是将 $DBH 放入调用中的情况下使用该方法?

感谢您的帮助!

您应该从 class 本身而不是在索引文件中获取 $DBH。然后,您可以使该数据库连接实例可用于 class 广泛地与 class 中的其他方法一起使用,而不必为每个函数重新连接,也不必为每个函数提供连接作为参数。

这方面的一个例子看起来像这样:

house.class.php

<?php
  class House{

      private $DBH;

      function __construct(){
        include_once "connection.inc.php";
        $this->DBH = $DBH;
      }

      function getColor($id){
        $this->DBH // <---- use it like this instead of your $DBH old variable.
      }
  }
?>

假设您有一个名为 House 的 class 和 getColor() 方法,并且在您的 index.php 中。您可以在 function/method 中使用关键字 global,但我强烈反对这样做。示例:

public function getColor(int $id)
{
    global $dbh;
    //and use it as $dbh
    $dbh->prepare(....
 }

或者你可以在构造函数中注入它。您的 class 的示例

class House
{

    private $dbh;
    function __construct($dbh)
    {
         $this->dbh = $dbh;
    }

    public function getColor($id)
    {
       //$this refers to current object context
        $this->dbh->prepare.....
    }
}

当您实例化 House 对象时,您会将 $DBH 传递给构造函数。您的 index.php 示例:

include_once "connection.inc.php";
$house = new House($DBH);
$house->getColor($id);

尽管如此,我还是建议您查看域驱动设计、工厂和存储库模式以及像 Doctrine 或 Eloquent 这样的 ORM,以更好地了解如何将 application/domain 逻辑与数据库分开。

class Database
{
    private $host = "localhost";
    private $dbname = "codeignitor";
    private $username = "root";
    private $password = "";
    public $conn;

    public function getConnection()
    {
        $this->conn = null;
        try {
            $this->conn = new PDO ("mysql:host=" . $this->host . ";dbname=" . $this->dbname, $this->username, $this->password);
            $this->conn->exec("set names utf8"); 
            // echo "MySqlConnected";
        } catch(PDOException $exception){ 
            echo "Connection error: " . $exception->getMessage(); 
        } 
            return $this->conn; 
    } 
}