Ситуация такова: в качестве СУБД может использоваться либо MSSQL, либо Postgres. Писать разный код для каждого - не хочется. Есть идея о создании некоего универсального класса, с методами Connect, Disconnect и Execute, с переопределением этих методов у конечных классов. Короче, что-то типа: Код (Text): class C_Custom_DB { public $srv=""; public $db=""; public $usr=""; public $pwd=""; protected $CurrConn = null; protected function Connect($srv, $db, $usr, $pwd) {} protected function Disconnect($conn) {} protected function ExecSQL($aSQL) {} protected function FieldByName($ResultSet, $RowID, $FieldName) {} protected function RecordCount($ResultSet) {} //*************************************************************************** function RaiseError($ErrMess) { echo ($ErrMess); } //*************************************************************************** } //*************************************************************************** class C_MSSQL_DB extends C_Custom_DB { //*************************************************************************** function __destruct() { if ($this->CurrConn != null) $this->Close($this->CurrConn); } //*************************************************************************** public function Connect($srv, $db, $usr, $pwd) { $this->CurrConn = mssql_pconnect($srv, $usr, $pwd); if (!$this->CurrConn) { RaiseError("Нет соединения с ".$srv); exit; } mssql_select_db($db, $this->CurrConn); return $this->CurrConn; } //*************************************************************************** public function Disconnect($conn) { mssql_close($conn); } //*************************************************************************** public function ExecSQL($aSQL, $conn = null) { if ($conn==null) { $tmp_conn = $this->CurrConn; } else { $tmp_conn = $conn; } return mssql_query($aSQL, $tmp_conn); } //*************************************************************************** public function FieldByName($ResultSet, $RowID, $FieldName) { return mssql_result($ResultSet, $RowID, $FieldName); } //*************************************************************************** public function RecordCount($ResultSet) { return mssql_num_rows($ResultSet); } //*************************************************************************** } Соответственно, такой же потомок C_Custom_DB для Postgres. Собственно вопрос в следующем: а как лучше хранить параметры соединения на Веб-Сервере? То, что это какой-то конфигурационный файл - это понятно. Можно XML (но я тут про него почитал - что-то больно сложно для такого простенького файла, если сил хватит, то позже разберусь). Остановился на CSV. Первым параметром идёт имя класса, бальше - ConnectionString для конкретного сервера. Читать - через fgetcsv в массив, дальше бедать в цикле и вытаскивать нужные параметры. Насколько такой метод "оптимален"? Может уже готовые решения есть для чтения структурированных файлов (типа как в Delphi TIniFile)? И вообще, как вы храните параметры подключения к БД на Веб-сервере?
Мне понравился проект Doctrine, но судя по задаче это будет охота на мух с помощью базуки. PS> в реальных условиях Doctrine не использовал, но мануал выглядит многообещающе
topas Для всякого рода систем управления со сложной бизнес логикой Doctrine и ему подобные самое оно, особенно если можно описать зависимости и он сам их потом таскает Ega23 У вас всёравно для каждой базы будет свой SQL, т.к. писать эффективные SQL запросы без использования особенностей каждой из баз просто не получится. ДА и работают они просто по разному.
Тьфу ты, как всё просто оказывается... Похоже это именно то, что мне нужно, без изобретательства велосипедов. Как я понял, мне дополнительно в PHP\Ext надо эти dll положить и включить их в php.ini Собственно, сам Apache и PHP ставил где-то полтора месяца назад, чуть поигрался и резко переключился на другую задачу. Сейчас снова вернулся, но уже весь процесс установки забыл. В PHP\Ext у меня лежит только php_mssql.dll Откуда брать остальные dll? переставлять PHP, или их где-то отдельно можно взять и туда подложить?
Это понятно. На самом деле это будет формализовано, скорее всего в виде ХП, в которую какие-то параметры подставляются. Сами запросы можно в отдельном файле хранить, вытягивая оттуда в зависимости от того, какой синтаксис нам сейчас нужен. А скорее всего это вообще на уровень сервера приложений уйдёт. Просто сейчас надо попрактиковаться, дабы в самом языке лучше ориентироваться.
Database DSN Код (Text): driver://user:password@server/dbname?param1=value1¶m2=value2 Для MySQL, например: Код (Text): mysql://root@localhost/test?charset=utf8 Я в PHP файле: PHP: <?php return array( 'dsn' => 'mysql://root@localhost/test?charset=utf8', 'charset' => 'UTF-8' // ... и т.д. );
мне DbSimple больше нравится http://dklab.ru/lib/DbSimple/manual.html, но с MSSQL не работает вроде - Ibase, Pg и My. хотя можно руками расширить на любую СУБД.