0

我正在开发一个从客户端 SQL Server 数据库查询数据的 Web 应用程序。访问所述数据库的凭据存储在我们服务器上的 MySQL 数据库中。单独查询它们真的不是那么难,(两个字母与函数的区别),但我最近有我的“哦,天哪,真是一团糟”的时刻,我正试图让事情变得更整洁一些。

OOP 来了。所以现在我已经在 MySQL 和 SQL Server 的单独文件中获得了基本的 CRUD 类,但我觉得完全没有必要为这种相似的(两个字母,来吧......)功能提供两个不同的包含。

我试图将两个类添加到一个文件中,但没有用。

那么这里的最佳实践是什么?

4

2 回答 2

2

一个好的方法是使用PDO,它为多个引擎(MySQL、MSSQL、PostgreSQL 等)抽象数据库连接。它也已经是 OOP 了。

如果您的代码是旧代码并且您无法更改为 PDO,则有几种选择。您可以使用反射抽象两个 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。

要记住的一件事 - 并非所有数据库都提供相同的功能。某些东西可以在 MSSQL 中工作,而在 MySQL 中不起作用。在这种情况下,您可以将 CRUD 语句包装在异常中。

另外,请考虑查看诸如 Doctrine 和 Propel 之类的 ORM。即使您选择不实施它们,它们也会教给您很多东西。

于 2012-05-31T16:05:10.903 回答