За последние 24 часа нас посетили 17512 программистов и 1651 робот. Сейчас ищет 1481 программист ...

Способы хранения ConnectionString на сервере

Тема в разделе "PHP для новичков", создана пользователем Ega23, 9 апр 2008.

  1. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Ситуация такова: в качестве СУБД может использоваться либо MSSQL, либо Postgres.
    Писать разный код для каждого - не хочется. Есть идея о создании некоего универсального класса, с методами Connect, Disconnect и Execute, с переопределением этих методов у конечных классов.
    Короче, что-то типа:

    Код (Text):
    1.  
    2. class C_Custom_DB
    3. {
    4.   public $srv="";
    5.   public $db="";
    6.   public $usr="";
    7.   public $pwd="";
    8.  
    9.   protected $CurrConn = null;
    10.  
    11.   protected function Connect($srv, $db, $usr, $pwd) {}
    12.   protected function Disconnect($conn) {}
    13.   protected function ExecSQL($aSQL) {}
    14.   protected function FieldByName($ResultSet, $RowID, $FieldName) {}
    15.   protected function RecordCount($ResultSet) {}
    16.  
    17.   //***************************************************************************
    18.  
    19.   function RaiseError($ErrMess)
    20.   {
    21.     echo ($ErrMess);
    22.   }
    23.  
    24.   //***************************************************************************
    25.  
    26. }
    27.  
    28. //***************************************************************************
    29.  
    30. class C_MSSQL_DB extends C_Custom_DB
    31. {
    32.   //***************************************************************************
    33.  
    34.   function __destruct()
    35.   {
    36.     if ($this->CurrConn != null) $this->Close($this->CurrConn);
    37.   }
    38.  
    39.   //***************************************************************************
    40.  
    41.   public function Connect($srv, $db, $usr, $pwd)
    42.   {
    43.     $this->CurrConn = mssql_pconnect($srv, $usr, $pwd);
    44.     if (!$this->CurrConn)
    45.     {
    46.       RaiseError("Нет соединения с ".$srv);
    47.       exit;
    48.     }
    49.     mssql_select_db($db, $this->CurrConn);
    50.     return $this->CurrConn;
    51.   }
    52.  
    53.   //***************************************************************************
    54.  
    55.   public function Disconnect($conn)
    56.   {
    57.     mssql_close($conn);
    58.   }
    59.  
    60.   //***************************************************************************
    61.  
    62.   public  function ExecSQL($aSQL, $conn = null)
    63.   {
    64.     if ($conn==null)
    65.     {
    66.       $tmp_conn = $this->CurrConn;
    67.     }
    68.     else
    69.     {
    70.       $tmp_conn = $conn;
    71.     }
    72.    
    73.     return mssql_query($aSQL, $tmp_conn);
    74.   }
    75.  
    76.   //***************************************************************************
    77.  
    78.   public  function FieldByName($ResultSet, $RowID, $FieldName)
    79.   {
    80.     return mssql_result($ResultSet, $RowID, $FieldName);
    81.   }
    82.  
    83.   //***************************************************************************
    84.  
    85.   public  function RecordCount($ResultSet)
    86.   {
    87.     return mssql_num_rows($ResultSet);
    88.   }
    89.  
    90.   //***************************************************************************
    91.  
    92. }
    Соответственно, такой же потомок C_Custom_DB для Postgres.

    Собственно вопрос в следующем: а как лучше хранить параметры соединения на Веб-Сервере? То, что это какой-то конфигурационный файл - это понятно. Можно XML (но я тут про него почитал - что-то больно сложно для такого простенького файла, если сил хватит, то позже разберусь). Остановился на CSV. Первым параметром идёт имя класса, бальше - ConnectionString для конкретного сервера. Читать - через fgetcsv в массив, дальше бедать в цикле и вытаскивать нужные параметры.
    Насколько такой метод "оптимален"? Может уже готовые решения есть для чтения структурированных файлов (типа как в Delphi TIniFile)?
    И вообще, как вы храните параметры подключения к БД на Веб-сервере?
     
  2. Anonymous

    Anonymous Guest

    Посмотрите в сторону PDO для начала
     
  3. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Мне понравился проект Doctrine, но судя по задаче это будет охота на мух с помощью базуки.

    PS> в реальных условиях Doctrine не использовал, но мануал выглядит многообещающе
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    topas
    Для всякого рода систем управления со сложной бизнес логикой Doctrine и ему подобные самое оно, особенно если можно описать зависимости и он сам их потом таскает :)

    Ega23
    У вас всёравно для каждой базы будет свой SQL, т.к. писать эффективные SQL запросы без использования особенностей каждой из баз просто не получится. ДА и работают они просто по разному.
     
  5. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Тьфу ты, как всё просто оказывается... Похоже это именно то, что мне нужно, без изобретательства велосипедов.
    Как я понял, мне дополнительно в PHP\Ext надо эти dll положить и включить их в php.ini
    Собственно, сам Apache и PHP ставил где-то полтора месяца назад, чуть поигрался и резко переключился на другую задачу. Сейчас снова вернулся, но уже весь процесс установки забыл. В PHP\Ext у меня лежит только php_mssql.dll Откуда брать остальные dll? переставлять PHP, или их где-то отдельно можно взять и туда подложить?
     
  6. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Это понятно.
    На самом деле это будет формализовано, скорее всего в виде ХП, в которую какие-то параметры подставляются. Сами запросы можно в отдельном файле хранить, вытягивая оттуда в зависимости от того, какой синтаксис нам сейчас нужен. А скорее всего это вообще на уровень сервера приложений уйдёт. Просто сейчас надо попрактиковаться, дабы в самом языке лучше ориентироваться.
     
  7. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Вопрос снят, разобрался.
     
  8. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Database DSN
    Код (Text):
    1. driver://user:password@server/dbname?param1=value1&param2=value2
    Для MySQL, например:
    Код (Text):
    1. mysql://root@localhost/test?charset=utf8
    Я в PHP файле:
    PHP:
    1. <?php
    2. return array(
    3.     'dsn' => 'mysql://root@localhost/test?charset=utf8',
    4.     'charset' => 'UTF-8'
    5.     // ... и т.д.
    6. );
     
  9. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Что-то я не пойму: а как в таком случае выглядит строка вызова этого массива из файла?
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. $config = include 'config.php';
     
  11. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    Ух-ты, и так, значит, можно....
    Возьму на заметку.
     
  12. Ega23

    Ega23 Активный пользователь

    С нами с:
    20 фев 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:
    Дубна
    ОГРОМНОЕ СПАСИБО!
    Именно то, что доктор прописал! Работает на ура и с MSSQL, и с Postgres
     
  13. creage

    creage Активный пользователь

    С нами с:
    12 мар 2008
    Сообщения:
    131
    Симпатии:
    0
    Адрес:
    Киев
    мне DbSimple больше нравится http://dklab.ru/lib/DbSimple/manual.html, но с MSSQL не работает вроде - Ibase, Pg и My. хотя можно руками расширить на любую СУБД.