将数据连接传递给PHP类/方法的推荐方法?

时间:2012-11-09 13:20:08

标签: php mysql oop class

截至目前,我的每个页面顶部都有一个数据库连接字符串。然后我将我的数据库连接传递给我的类中的方法,如下所示:

public function select($db) {
  //Code here
}

页面上的代码:

$login_user->select($db);

我的想法是,如果我想查询不同的数据库,我可以在我的包含文件$ db2中创建一个新的连接字符串,然后我只传递该值而不是$ db。

这是执行此操作的标准方式还是您有不同的建议?

3 个答案:

答案 0 :(得分:3)

将连接字符串传递给您的类有很多缺点,没有任何好处。您处于正确的轨道上,但是您想要传递数据库对象而不是连接字符串。

依赖注入是一种让你的类访问数据库的好方法,它只是意味着将依赖项(即数据库对象)传递给需要它们的对象,而不是对象本身从一些全局变量中获取依赖项。样。

我建议您在类上使用类似setDb()的方法来传递数据库对象,然后将其存储为属性以供内部使用。

例如,假设您已在初始化脚本中创建了数据库对象$db

class SomeClass
{
    protected $db;

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

    public function something()
    {
        // do some query on the database using $this->db
    }
}

$obj = new SomeClass();
$obj->setDb($db);

$obj->something();

DI为您提供了您提到的好处:无需在方法中进行大量工作即可轻松切换数据库。还有其他好处,即易于测试。

答案 1 :(得分:2)

正如已经指出的,这是一种非常常用的方法。但是,由于你包含了OOP标签,我猜你也在寻找关于主题的OO视图:)。恕我直言,这种方法的问题是你使用字符串来表示在你的问题域(数据库连接)中有意义的东西。这样做的一个问题是你不能将行为委托给一个字符串,所以你最终会处理遍布整个系统的函数中的连接错误或者其他不应该关心它的对象中的连接错误。责任(根据经验,我总是试图坚持SRP)。此外,如果您生成模型的文档(如UML图),那么数据库连接将是您的系统中使用的概念,不会在文档中表示(因为没有类来表示它)。最后,使用对象建模数据库连接及其相关的数据库访问是一种非常常用的方法,例如参见Zend DB Adapter类。

HTH

答案 2 :(得分:2)

首先开发一个处理与数据库有关的所有事务的类。这是我开始的数据库类的示例。它没有完成,但您可以使用它传入不同的数据库,表或任何您想要的内容。

<?php
 class Database
 {      // BEGIN class database
     // variables
   protected $db_host;
   protected $db_user;
   protected $db_password;
   protected $db_name;
   protected $connection;
   protected $queryRun;
   protected $numRows;
   protected $seldb;

// constructor
function __constructor(){
}
public function connect($db_host,$db_user,$db_password,$db_name)
{
    $this->db_host = $db_host;
    $this->db_user = $db_user;
    $this->db_password = $db_password;
    $this->db_name = $db_name;
    $this->connection = mysql_connect($this->db_host,$this->db_user,$this >db_password);
    if(!$this->connection)
    {
        mysql_error();
    }
    $this->seldb = mysql_select_db($this->db_name,$this->connection);
    if(!$this->seldb)
    {
        mysql_error();  
    }
}
public function disconnect()
{
    mysql_close($this->connection);
}
public function query(){
    $this->queryRun = mysql_query($this->sql,$this->connection);
    return $this->queryRun;
}
public function select($table,$columns = '*',$where = null,$order = null,$sort = null)
{
    $this->sql = 'SELECT ' .$columns. ' FROM ' .$table;
    if($where != null)
    {
        $this->sql . ' WHERE ' . $where;
    }
    if($order != null)
    {
        $this->sql . ' ORDER ' . $order;
    }
    if($sort != null)
    {
        $this->sql . ' SORT BY ' . $sort; 
    }
}
public function insert($table,$columns,$updatecolumns,$where = null)
{
    $this->sql = 'INSERT INTO ' .$table. '(' .$columns. ') VALUES (' .$updatecolumns. ')';
    if($where != null)
    {
        $this->sql . ' WHERE ' . $where;
    }
}

public function outputQuery()
{
    if(!$this->queryRun)
    {
        echo "Error";
    }
    else {
        $numRows = mysql_fetch_array($this->queryRun);
        foreach($numRows as $rows)
        {
            echo "<div id='feeditem'>";
            echo "<a href='#'><textarea>";
            echo $rows;
            echo "</textarea></a>";
            echo "</div>";
        }
    }
}

  }
?>

然后,您可以创建该类的实例,并在需要时使用您需要的类中的任何一个函数。

<?php
    include 'database.class.php';
    database1 = new Database();
    database1->connect('127.0.0.1','root','','users');
?>

这样的事情将是一个良好的开端。