0

だから、私はデータベース接続を必要とするプロジェクトに取り組んでいます。汎用性のために PDO を使用することにしましたが、接続をセットアップする方法を理解する必要があります。現在、私は次のようなものを目指しています:

class Database {
  private static $db;
    static function initDB() {
      if(!is_object(self::$db) || get_class(self::$db) != 'PDO') {
        include('core/db.php');
        try {
            $db = new PDO($database, $username, $password);
        } catch(PDOException $e) {
            print("<br />Could not establish database connection. Error message: ".$e->getMessage()."<br />");
            die();
        }
    }
    //Try the transaction
    /*
    if($transaction = $db::query(PDO::quote($value)))
        $db::query(PDO::quote("INSERT INTO log VALUES ('".Authorization::$user."','".PDO::quote($value)."', 'Success')"));
    else
        $db::query(PDO::quote("INSERT INTO log VALUES ('".Authorization::$user."','".PDO::quote($value)."', 'Failure')"));*/
 }
}

したがって、これは、私がよく知らない概念の 1 つ、つまりシングルトンと静的クラス/オブジェクトを明らかにしています。何らかの方法でスクリプトで初期化するベストプラクティスを使用してデータベース接続を設定する方法はありますか?OO__construct

4

2 に答える 2

1

データベース接続は、静的またはシングルトンであってはなりません。これは単に別の形式のグローバル状態を導入するだけであり、単体テストには適しておらず、明らかな依存関係が隠されています。

ここでの正しい方法は、PDOそれを必要とするクラスに のインスタンスを注入することです。単一責任の原則依存性注入を順守します。

単一責任の原則に違反しているため、エラーをログに記録してコンストラクター内で実行しないでください。include()PDOAdapter

したがって、これは次のようになります。

final class PDO_Provider extends PDO
{
    /**
     * Constructor. Inits PDO 
     * 
     * @param array $params
     * @return void
     */
    public function __construct(array $params)
    {
        try {

            extract($params);

            parent::__construct(sprintf('mysql: host=%s; dbname=%s', $host, $database), $user, $password);

            $this->setAttribute(parent::MYSQL_ATTR_INIT_COMMAND, 'SET NAMES UTF8');
            $this->setAttribute(parent::ATTR_ERRMODE, parent::ERRMODE_EXCEPTION);
            $this->setAttribute(parent::ATTR_EMULATE_PREPARES, false);
            $this->setAttribute(parent::ATTR_DEFAULT_FETCH_MODE, parent::FETCH_ASSOC);

        } catch(PDOException $e) {

            die($e->getMessage());
        }
    }
}

そして、あなたはそれをこのように使うでしょう、

<?php


$sql_config = array(
    'host'          =>  'localhost',
    'user'          =>  'root',
    'password'      =>  '',
    'database'      =>  '_DB_NAME_',
);

// <- Or you can include that, like 
$sql_config = include(__DIR__ . '/core/db_params.php');

$pdoProvider = new PDO_Provider($sql_config);

$user = new User_Login($pdoProvider); // the point here is to inject an instance of $pdoProvider. User_Login is actually irrelevant
于 2013-06-28T04:22:08.040 に答える
-1

sigleton の代わりに通常のオブジェクトを使用する場合は、次のようにしてください。

class PDOConnector{

    protected $connection;

    function __construct($host, $user, $pass, $db_name)
    {
        //create database connection
        try{
            $this->connection = new PDO('mysql:host='.$this->host.';dbname='.$this->db_name.';charset=utf8', $this->user, $this->pass,array(PDO::ATTR_EMULATE_PREPARES => false, 
                                                                                                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        }
        catch(PDOException $ex) {
            echo "An Error occured : ".$ex->getMessage();               
        }

    }

}
于 2013-06-28T04:14:24.397 に答える