推荐的方式传递数据连接PHP类/方法?(Recommended way for passing da

2019-10-17 09:20发布

截至目前我已经包含在每一个我的网页顶端的数据库连接字符串。 然后,我通过我的数据库连接,在我的课像这样的方法:

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

代码页:

$login_user->select($db);

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

这是这样做的标准方式或者你有不同的建议?

Answer 1:

传递一个连接字符串,以你的类有很多缺点,没有任何好处的。 你是在正确的轨道上,但你想通过数据库对象,而不是一个连接字符串。

依赖注入是给你的类对数据库的访问,这仅仅意味着通过依赖(即数据库对象)到需要它们,而不是从某种类型的全局变量的依赖对象本身的对象的好方法。

我会建议你使用类似的方法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为您提供了你所提到的好处:容易地切换分贝,而无需做大量的工作在你的方法的能力。 还有其他的好处,即方便测试。



Answer 2:

正如已经指出的,这是一个非常使用的方法。 然而,由于包含的是面向对象的标签我猜你也正在寻找关于这个问题:)一种面向对象的视图。 恕我直言,这种做法的问题是,你正在使用一个字符串来表示的东西,在你的问题域(DB连接)的含义。 一个与这样的问题是,你不能委派行为为字符串,所以你最终的处理之类的东西在功能遍布你的系统或其他物体连接错误,不应该关心它,实际上有其他责任(作为一个经验法则我总是试图坚持SRP )。 此外,如果您生成模型(如UML图)的文件是数据库连接会在你的系统不会在文档来表示(因为没有一个类来表示它)所使用的概念。 最后,造型DB连接,并与对象及其关联DB访问是一个相当常用的方法,参见例如Zend的数据库适配器类。

HTH



Answer 3:

通过开发,处理一切与数据库中的类开始。 这里是一个数据库类,我开始的一个例子。 它没有这样做,但你可以使用它在不同的数据库,表,或任何你想传递。

<?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');
?>

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



文章来源: Recommended way for passing data connection to a PHP class / method?