我正在开发一个从客户端SQL Server数据库查询数据的Web App。访问所述数据库的凭据存储在我们服务器上的MySQL数据库中。分别查询它们真的不是那么难,(两个字母与功能的区别),但我最近有了“哦上帝真是一团糟”的时刻,我正在努力使事情变得更加整洁。
来自OOP。所以现在我已经在MySQL和SQL Server的单独文件中有了基本的CRUD类,但我觉得完全没有必要为这样的类似(两个字母,来吧......)功能提供两个不同的包含。
我试图将这两个类添加到一个文件中,但是没有用。
那么这里最好的最佳做法是什么?
答案 0 :(得分: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';
}
答案 1 :(得分:1)
使用PDO object和相关驱动程序。 MySQL和MSSQL都有驱动程序。使用工厂生成正确的PDO对象,然后使用该对象实际写入数据库。
例如(伪代码):
$PDO = PDOFactory::getPDO( $database_type, $username, $password );
$PDO->write($data);
您的CRUD不关心它正在使用哪个PDO,只关心它是PDO接口的东西。如果再次更改数据库,则只需更新数据库类型。此外,对于单元测试,您可以传入模拟PDO。
要记住一件事 - 并非所有数据库都提供相同的功能。某些东西可以在MSSQL中工作,但在MySQL中不起作用。在这种情况下,您可以将CRUD语句包装在异常中。
另外,考虑一下像Doctrine和Propel这样的ORM。即使你选择不实施它们,它们也会教你很多。