【问题标题】:How to use database connection in other classes如何在其他类中使用数据库连接
【发布时间】:2023-03-03 09:58:02
【问题描述】:

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 的类,其中我有一个对我的数据库进行 SQL 查询的方法。我通过 index.php 中的 'getColor($id, $DBH)' 调用该方法

有什么方法可以使用该方法而不总是将 $DBH 放入调用中?

感谢您的帮助!

【问题讨论】:

  • 您可以从函数内部获取 $DBH。或者你可以在类的构造函数中获取$DGH。
  • 如何从函数内部获取 $DBH?我需要做什么?这可能是我的问题的答案。谢谢
  • 最好将其注入到房屋类构造函数中,并将其分配为对象属性/字段。

标签: php class oop methods database-connection


【解决方案1】:

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

这方面的一个例子如下所示:

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.
      }
  }
?>

【讨论】:

  • 非常感谢,有帮助!
  • 这是错误的。此类无法进行单元测试,因为无法模拟 $DBH。
【解决方案2】:

假设你有一个名为House 的类,它有一个getColor() 方法,并且在你的index.php 中。您可以在函数/方法中使用关键字global,但我强烈反对这一点。示例:

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

或者你可以在构造函数中注入它。您的班级的外观示例

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,以进一步了解如何将您的应用程序/域逻辑与数据库分离。

【讨论】:

  • 如果您强烈反对,为什么要在您的答案中包含全局方法?
  • 谢谢!这正是我正在寻找的!
  • OP 将来可能会遇到类似的事情,所以建议不要这样做,我应该举一个例子来说明它的样子。你不觉得@Don'tPanic 吗?
  • 当然,这是有道理的。
【解决方案3】:
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; 
    } 
}

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2018-10-15
    • 2012-07-20
    • 2019-02-02
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多