MySQL или SQL Server - PullRequest
       7

MySQL или SQL Server

0 голосов
/ 13 июня 2010

Я создаю приложение, которое хочу запустить на MySQL или SQL Server (не одновременно). Я создал два класса PHP DatabaseMySQL и DatabaseSQLSVR, и мне бы хотелось, чтобы мое приложение знало, какой класс базы данных использовать на основе константы, установленной при установке.

define (DB_TYPE, "mysql"); // или "sqlsrv"

Я пытаюсь придумать лучший способ справиться с этим. Моя мысль состоит в том, чтобы делать «если еще», где бы я ни создавал базу данных:

$ db = (DB_TYPE == "mysql")? новый DatabaseMySQL: новый DatabaseSQLSVR;

Я знаю, что должен быть лучший способ сделать это. Предположим, я хочу добавить третий тип базы данных позже; Я должен пойти и повторить весь мой код.

Ответы [ 5 ]

1 голос
/ 13 июня 2010

В простейших возможных терминах:

Используйте определение, чтобы определить DB_TYPE как YourFullyQualifiedClassName, затем ...

define('DB_TYPE', 'DatabaseMySQL') // or DatabaseSQLSVR or ...
$myDBType = DB_TYPE;
$db = new $myDBType();
1 голос
/ 13 июня 2010

Вы должны изучить использование такой технологии, как PEAR.

Вот хорошая статья о PEAR. http://www.evolt.org/node/21927

0 голосов
/ 14 июня 2010

Проблема в том, что есть какой-то нечетный бит синтаксиса, который вы никогда не планировали, который обрабатывается совершенно по-разному различными драйверами - например, объясняйте планы, транзакции ...

Хорошая отправная точкаиспользовать общий набор инструментов абстракции, такой как dbx , adodb или PDO .

В каждом случае на драйвер СУБД можно ссылаться как на элемент данных так же, как на имя пользователя или пароль - без условных операторов.

C.

0 голосов
/ 13 июня 2010

Я предлагаю вам создать два объекта доступа к данным, которые выполняют различные действия с БД, необходимые для вашего приложения.Используйте Factory Pattern для возврата реализации MySQL или MS SQL и выполняйте весь доступ к данным на ваших страницах PHP с использованием этого объекта доступа к данным.

Таким образом, вы можете настроить поведениеOMG Ponies предлагает) по мере необходимости для каждой целевой базы данных.Если вы используете общий базовый класс, вы можете наследовать одну и ту же реализацию для обеих баз данных и предоставлять только конкретную реализацию, где это оправдано (хотя я не сделал много OO PHP ... не уверен, поддерживается ли наследование?).

0 голосов
/ 13 июня 2010

Обычный способ состоит в том, чтобы они оба назывались одинаково (скажем, база данных), и каждый из них помещался в отдельный файл. Тогда вам понадобится:

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

и вы можете просто $ db = new Database ();

РЕДАКТИРОВАТЬ: обратите внимание, что для правильной работы вашей системы важно иметь интерфейс, который оба класса реализуют соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...