1

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

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

页面代码:

$login_user->select($db);

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

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

4

3 回答 3

5

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

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

我建议您使用类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 为您提供了您提到的好处:能够轻松切换数据库,而无需在您的方法中做大量工作。还有其他好处,即易于测试。

于 2012-11-09T14:05:54.460 回答
2

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

高温高压

于 2012-11-09T13:48:41.670 回答
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');
?>

像这样的事情将是一个好的开始。

于 2012-11-09T20:51:08.473 回答