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 には、あなたが言及した利点があります。つまり、メソッドで多くの作業を行うことなく、db を簡単に切り替えることができます。他にも、テストの容易さという利点があります。

于 2012-11-09T14:05:54.460 に答える
2

すでに指摘したように、これは非常によく使われるアプローチです。ただし、OOPタグを含めたので、この件名に関するOOビューも探していると思います:)。このアプローチの問題は、問題のドメイン(DB接続)で意味を持つものを表すために文字列を使用していることです。これを行う際の問題の1つは、動作を文字列に委任できないことです。そのため、システム全体に分散している関数や、それを気にせず実際に他のオブジェクトを持っている他のオブジェクトの接続エラーなどを処理することになります。責任(経験則として、私は常にSRPに固執しようとします)。また、モデルのドキュメント(UML図など)を生成する場合、DB接続はシステムで使用される概念であり、ドキュメントには表示されません(モデルを表すクラスがないため)。最後に、オブジェクトを使用したDB接続とそれに関連するDBアクセスのモデル化は、非常によく使用されるアプローチです。たとえば、ZendDBAdapterクラスを参照してください。

HTH

于 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 に答える