2010-06-13 60 views
0

我正在创建一个应用程序,我想要在MySQL或SQL Server上运行(不是同时运行)我创建了两个PHP类DatabaseMySQL和DatabaseSQLSVR,并且希望我的应用程序能够根据在安装时设置的常量知道要使用哪个数据库类。MySQL或SQL Server

define(DB_TYPE,“mysql”); //或“sqlsrv”

我在想办法解决这个问题。我的想法是在我实例化数据库的地方执行“if else”:

$ db =(DB_TYPE ==“mysql”)?新的DatabaseMySQL:新的DatabaseSQLSVR;

我知道必须有更好的方法来做到这一点。假设我想稍后添加第三个数据库类型;我必须去重做我的所有代码。

+1

现实情况是,除非是非常简单的SQL,否则您必须调整语句。但如果你想获得最佳表现,这就是要走的路。 – 2010-06-13 18:31:37

+0

而且你总是可以使用switch ... case语句而不是if ... else if ... else。当然,还有更好的解决方案,请参阅 – 2010-06-13 22:20:41

回答

1

在描叙:

用定义来定义“DB_TYPE”作为YourFullyQualifiedClassName,然后...

define('DB_TYPE', 'DatabaseMySQL') // or DatabaseSQLSVR or ... 
$myDBType = DB_TYPE; 
$db = new $myDBType(); 
+3

我建议让一些(抽象?)基类继承并检查你的新实例是否确实继承了那个类(参见http://www.php.net/instanceof) – Kris 2010-06-13 18:36:45

+0

Kris,我做了一个“数据库”这两个类都扩展的超类;这似乎是正确的做法。但是,说实话,我不确定在这一点上它会对我有什么好处? – jwerre 2010-06-14 02:05:24

+0

它对您有益,因为您在更具体的类中覆盖的所有内容都必须与共享的基类保持兼容。与更具体的实例交谈的其他代码现在可以假定它正在与更通用的基类进行通信,而不用担心实际的实现。 – Kris 2010-06-14 08:46:01

0

通常的方法是让它们都调用相同的(比如说数据库),并且每个都放在一个单独的文件中。然后你需要:

define(DB_TYPE, "mysql"); // or "sqlsrv" 
require('db/' . DB_TYPE . '.php'); 

你可以只是$ db = new Database();

编辑:请注意,它是至关重要的,您的系统正常工作有一个接口,这两个类相应地执行。

+1

以下的答案,这些答案可以很好地解决任何自动加载问题,并且如果您使用的是正确的IDE,则可能会让您感到困惑(代码完成将不知道用于“数据库”的类)我会说不好的主意。 – Kris 2010-06-13 18:38:36

+0

如果它们实现相同的接口,则不适用。 此外,类必须使用相同的确切方法才能正常工作。 – kamasheto 2010-06-13 18:56:05

1

您应该研究使用诸如PEAR等技术。

这是关于梨的一篇很好的文章。 http://www.evolt.org/node/21927

+1

梨看起来很有趣。请注意,您仍然需要自己编写特定于版本的SQL语句,以获得最佳性能,或者完成非标准SQL但在不同数据库中受到不同支持的事情。 – 2010-06-13 18:38:05

+0

我同意,如果您的要求是支持多个DBMS,那么使用一个库。 – 2010-06-13 19:07:27

+0

我检查了它,它看起来像PEA :: DB自发支持多个数据库连接。我不确定我想要那种内存使用情况。更何况我已经建立了我的数据库类。 – jwerre 2010-06-14 02:02:01

0

我建议您创建两个数据访问对象,用于执行应用程序需要的各种数据库操作。使用Factory Pattern返回MySQL或MS SQL实现,并使用该数据访问对象在PHP页面中执行所有数据访问。

这样,您可以根据每个目标数据库的需要调整行为(如OMG Ponies所建议的)。如果你使用一个通用的基类,你可以继承两个数据库的相同实现,并且只在必要时提供特定的实现(虽然我没有做太多OO PHP ......不知道是否支持继承)。

+0

是的,我可以拥有数据库超类。 – jwerre 2010-06-13 22:55:27

0

的问题是,有你从未想象过的语法的一些奇怪的位这是由不同的驱动程序以完全不同的方式处理 - 例如解释计划,交易...

一个很好的出发点是使用一个通用的抽象工具,如dbxadodb,或PDO

在每种情况下,DBMS驱动程序都可以以与用户名或密码相同的方式引用为数据项 - 无条件语句。

C.