0

クライアントの SQL Server データベースからデータを照会する Web アプリに取り組んでいます。上記のデータベースにアクセスするための資格情報は、サーバー上の MySQL データベースに保存されます。それらを個別にクエリすることは実際にはそれほど難しくありませんが (関数との 2 文字の違い)、最近「なんてこった」という瞬間があり、物事をもう少し整理しようとしています。

OOPが入ります。これで、基本的な CRUD クラスを MySQL と SQL Server の個別のファイルに格納できましたが、このような同様の (2 文字、来てください...) 機能に対して 2 つの異なるインクルードを含める必要はまったくないと思います。

両方のクラスを 1 つのファイルに追加しようとしましたが、うまくいきませんでした。

では、ここでのベスト ベスト プラクティスは何でしょうか。

4

2 に答える 2

2

良いアプローチは、複数のエンジン (MySQL、MSSQL、PostgreSQL など) のデータベース接続を抽象化するPDOを使用することです。それはすでにOOPでもあります。

コードがレガシーで PDO に変更できない場合、いくつかの代替手段があります。リフレクションを使用して、2 つの CRUD クラス間の共通コードの多くを抽象化できます。

abstract class AbstractLegacyConnection
{
    protected $connectFunction = '';
    protected $queryFunction = '';

    public function connect($host, $user, $pass) 
    {
        return call_user_func($this->connectFunction, $host, $user, $pass);
    }

    public function query($sql) 
    {
        return call_user_func($this->queryFunction, $sql);
    }
}

class MySQLLegacyConnection extends AbstractLegacyConnection
{
    protected $connectFunction = 'mysql_connect';
    protected $queryFunction = 'mysql_query';
}
于 2012-05-31T16:12:57.123 に答える
1

関連するドライバーでPDO オブジェクトを使用します。MySQL 用と MSSQL 用のドライバーがあります。ファクトリを使用して適切な PDO オブジェクトを生成し、そのオブジェクトを使用して実際にデータベースに書き込みます。

例(疑似コード):

$PDO = PDOFactory::getPDO( $database_type, $username, $password );
$PDO->write($data);    

CRUD は、どの PDO で動作しているかは気にしません。PDO インターフェースを備えたものであるということだけです。データベースを再度変更する場合は、データベースの種類を更新するだけです。さらに、単体テストのために、モック PDO を渡すことができます。

すべてのデータベースが同じ機能を提供するわけではありません。MySQL では機能しないものでも、MSSQL では機能します。この場合、CRUD ステートメントを例外でラップできます。

また、Doctrine や Propel などの ORM を検討することも検討してください。実装しないことを選択した場合でも、それらは多くのことを教えてくれます。

于 2012-05-31T16:05:10.903 に答える