Подключаемся к СУБД CUBRID через PHP

    Итак Вы, я уверен, уже знаете, как в PHP подключаться и работать с определенными реляционными системами баз данных. В этом блоге я расскажу, как начать работу в PHP с СУБД CUBRID, в чем ее отличие от других систем, а также приведу примеры для быстрого начала. Хорошая новость заключается в том, что последняя версия CUBRID 8.4.0 на 90% совместима с MySQL и с точки зрения SQL синтаксиса, и с точки зрения функций PHP.

    Сразу оговорюсь, что речь будет идти о PHP версии 5.2 и выше, ибо это минимальное требование для работы с СУБД CUBRID в PHP.

    Установка


    Установка PHP драйвера для CUBRID типична. В ОС Windows Вы можете использовать автоматический исталлятор, либо можете вручную прописать все необходимое в конфигурационном файле php.ini. В ОС Linux инструкции почти такие же: можно использовать инсталлятор PECL, либо самому изменить php.ini.

    Установка PHP Драйвера с помощью Установщика Windows

    1. Скачайте последнюю версию CUBRID PHP API Installer с оффициального сайта (< 870КБ). В этом установшике есть все версии PHP драйвера на всевозможные комбинации PHP и CUBRID.
    2. Убедитесь, что сам движок PHP и СУБД CUBRID установлены.
    3. Запустите установшик.
    4. Все как в типичном Windows исталляторе:
    • укажите путь для установки;
    • подтвердите имя папки для главного меню Старт;
    • нажмите на "Установить".

    Готово! Не забудьте перезапустить свой Веб сервер. В результате этой установки, инсталлятор автоматически определит версию Вашего PHP движка, версию СУБД CUBRID, а также папку, в котором по-умолчанию PHP хранит свои драйвера (обычно это C:\Program Files\PHP\ext). Исходя из этого, установщик скопирует необходимый php_cubrid.dll в эту папку со всеми остальными драйверами. Затем он добавит следующие две строчки в конфигурационный файл php.ini.

    [PHP_CUBRID]
    extension=php_cubrid.dll

    Все стандартно, но все происходит автоматически без Вашего участия. Этот же способ, но уже на английском и со скриншотами можете посмотреть здесь.

    Ручная конфигурация php.ini в ОС Windows

    То же самое, что делает CUBRID PHP API Installer, Вы можете сделать сами.
    1. Скачайте необходимый для Вас драйвер с оффициального сайта (< 40КБ). Доступны как и thread-safe, так и non-thread-safe версии для Apache и IIS.
    2. Распакуйте архив.
    3. Скопируйте php_cubrid.dll в папку, где лежат Ваши остальные PHP драйвера.
    4. Откройте конфигурационный файл php.ini и вставьте в конце файла вышеуказанные две строчки.
    5. Сохраните измененния и перезапустите свой Веб сервер.

    Все готово!

    Установка PHP Драйвера в ОС Linux с помощью Исталлятора PECL

    Здесь мы покажем как установить CUBRID PHP драйвер в ОС Linux, основанных на DEBIAN. Для RPM основанных Linux смотрите инструкцию ниже.
    1. Устанавливаем phpize
      sudo apt-get install php5-dev
    2. Устанавливаем пакет PEAR, который предоставляет команды PECL
      sudo apt-get install php-pear
    3. Теперь устанавливаем сам CUBRID PHP драйвер с помощью команды PECL.
      sudo pecl install cubrid
      Это установит последнюю версию драйвера cubrid.so. Если Вам нужен один из предыдущих версий, то укажите версию при установке так:
      sudo pecl install cubrid-8.3.0.0005
      Если в этот момент отобразится запрос "CUBRID base install dir [autodetect] :", введите полный путь директории, в который установлен CUBRID. Например, если CUBRID установлен в /home/cubridtest/CUBRID, введите /home/cubridtest/CUBRID.
    4. В конце Вам необходимо изменить конфигурационный файл php.ini, добавив следующие две строчки в конце файла.
      [CUBRID]
      extension=cubrid.so


    Установка CUBRID PHP драйвера в ОС Linux, основанных на RPM.
    1. Устанавливаем phpize
      yum install php-devel
    2. Скачиваем пакет PEAR
      wget pear.php.net/go-pear.phar
    3. Запускаем пакет PEAR в PHP
      php go-pear.phar
    4. Теперь устанавливаем сам CUBRID PHP драйвер с помощью команды PECL.
      pecl install cubrid
      Это установит последнюю версию драйвера cubrid.so. Если Вам нужен один из предыдущих версий, то укажите версию при установке так:
      pecl install cubrid-8.3.0.0005
      Если в этот момент отобразится запрос "CUBRID base install dir [autodetect] :", введите полный путь директории, в который установлен CUBRID. Например, если CUBRID установлен в /home/cubridtest/CUBRID, введите /home/cubridtest/CUBRID.
    5. В конце Вам необходимо изменить конфигурационный файл php.ini, добавив следующие две строчки в конце файла.
      [CUBRID]
      extension=cubrid.so


    Готово! Не забудьте перезапустить Веб сервер.

    Ручная конфигурация php.ini в ОС Linux

    Установить CUBRID PHP драйвер можно и без phpize и PEAR — вручную. Смотрим инструкции ниже.

    1. Скачайте необходимый для Вас драйвер с оффициального сайта (< 80КБ). Доступны версии как и для x64, так и для x86.
    2. Распакуйте архив.
    3. Скопируйте cubrid.so в директорию, где лежат Ваши остальные PHP драйвера (обычно это /usr/lib/php5/20090626 для PHP 5.3.3, где 20090626 название директории, которая может изменяться в зависимости от версии PHP).
    4. Откройте конфигурационный файл php.ini (обычно находится в /etc/php5/apache2/php.ini) и вставьте в конце файла следующие две строчки.
      [CUBRID]
      extension=cubrid.so

    5. Сохраните измененния и перезапустите свой Веб сервер.

    Готово! Если возникнут проблемы при установки драйвера, напишите в комментариях.

    Работа с драйвером CUBRID PHP


    Как Вы, должно быть, знаете, подключение и работа с базами Oracle и PostgreSQL похожи в каком-то роде. Работая с ними, Вы напрямую подключаетесь к определенной базе, нежели к хосту или серверу в целом, как Вы обычно делаете в MySQL и MSSQL. В случае MySQL и MSSQL вы создаете соединение с хостом, затем второй шаг — выбираете базу, к которой Вам необходимо подсоединиться.

    Работа с СУБД CUBRID в этом смысле похожа на Oracle и PostgreSQL. Вы напрямую подключаетесь к базе данных, с которым Вы хотите работать. Поэтому в CUBRID PHP, как и в Oracle и PostgreSQL, нет функций, которые позволяют создавать, удалять или выбирать базы данных, за исключением тех функций, которые выдают информацию о рабочей базе. Вот в этом они отличаются от библиотек MySQL и MSSQL.

    Синтаксис

    resource cubrid_connect(string $host, int $port, string $dbname [, string $userid [, string $passwd ]] )

    Пример

    $host_ip = "localhost";
    $host_port = 33000;
    $db_name = "demodb";

    $conn = cubrid_connect($host_ip, $host_port, $db_name)
    or die("Could not connect: " . cubrid_error());

    print ("Connected successfully");

    cubrid_close($conn);


    По-умолчанию параметр auto_commit при подключении отключен, т.е. во всех следующих транзакциях Вы должны сами подтверждать транзакцию. Например:

    cubrid_commit($conn);

    Такая реализация очень удобна, если Вы хотите программно контролировать дальнейшие действия при ошибках в транзакциях (т.е. выдавать какие-то определенные сообщения и т.п.). Если предпочтете фиксировать все транзакции, можете включить auto_commit либо сразу при подключении, либо уже во время работы. В первом случае подсоединяйтесь через cubrid_connect_with_url.

    $conn_url = "cci:CUBRID:127.0.0.1:33088:demodb:dba:123456:?autocommit=off"
    $conn = cubrid_connect_with_url($conn_url);

    Таким образом, все запросы будут фиксироваться автоматически. Во втором случае вызывайте функцию cubrid_set_autocommit в необходимый момент, например:

    if (cubrid_set_autocommit($conn, true)){
    echo "Теперь все автоматом коммитится";
    }

    Точно также можно отключить auto_commit. Чтобы узнать статус auto_commit во время работы, Вы можете вызвать cubrid_get_autocommit.

    Все остальные запросы в CUBRID очень похожи на синтаксис MySQL.

    // Синтаксис запросов одинаков
    $sql = "select sports, count(players) as players from event group by sports";
    // Замените просто на просто приставку "mysql_" на "cubrid_"
    $result = cubrid_query($conn, $sql);
    
    if ($result){
    	// количество столбцов в запросе
    	$num_fields = cubrid_num_fields($result);
    	
    	echo("<tr>");
    
    	// имена столбцов в запросе по синтаксису MySQL
    	for ($i = 0; $i < $num_fields; ++$i){
    		echo("<td align=center>");
    		echo(cubrid_field_name($result, $i));
    		echo("</td>");
    	}
    
    	echo("</tr>");
    
    	// то же самое можно сделать в стиле CUBRID, но только одним запросов
    	$columns = cubrid_column_names($result);
    	echo("<tr>");
    
    	while (list($key, $colname) = each($columns)){
    		echo("<td align=center>$colname</td>");
    	}
    
    	echo("</tr>");
    
    	// Получаем численный и ассоциативный массив
    	while ($row = cubrid_fetch_array($result)){
    		// также можно использовать cubrid_fetch_assoc, cubrid_fetch_field,
    		// cubrid_fetch_lengths, cubrid_fetch_row и cubrid_fetch_object
    		// Все как в MySQL
    		echo("<tr>");
    
    		for ($i = 0; $i < $num_fields; ++$i){
    			echo("<td align=center>");
    			echo($row[$i]);
    			echo("</td>");
    		}
    
    		echo("</tr>");
    	}
    }
    
    cubrid_close($conn);
    

    Для ввода нового или обновления старого значения, можно использовать те же функции, что и в MySQL, но уже с приставкой «cubrid_».

    $sql = "insert into olympic (host_year,host_nation,host_city,"
    		. "opening_date,closing_date) values (2008, 'China', 'Beijing',"
    		. "to_date('08-08-2008','mm-dd-yyyy'),to_date('08-24-2008','mm-dd-yyyy')) ;"
    
    $result = cubrid_query($cubrid_con, $sql);
    
    if ($result){
    	// Если auto_commit не включен по-умолчанию, то подтвердаем транзакцию
    	if (!cubrid_get_autocommit($cubrid_con)){
    		cubrid_commit($cubrid_con);
    	}
    
    	echo("Inserted successfully ");
    }
    else{
    	echo(cubrid_error());
    	cubrid_rollback($cubrid_con);
    }
    
    cubrid_disconnect($cubrid_con);
    

    Чтобы получить ID, сгенерированного при последнем INSERT-запросе, учитывая, что в таблице есть столбец с AUTO_INCREMENT ограничением, можно вызвать функцию cubrid_insert_id. Отличается эта функция от mysql_insert_id лишь тем, что в CUBRID функция возвращает строку, в то время как MySQL — число int. Удобство строки заключается в том, что эта функция может возвращать ID типа BIGINT, в то время как функцию MySQL нельзя использовать для больших чисел. Если в таблице нет AUTO_INCREMENT столбцов, cubrid_insert_id возвратит 0.

    После ввода новых значений или обновления уже имеющихся, как и в MySQL, можно вызвать cubrid_affected_rows, чтобы узнать сколько строк были изменены в результате, указанного в качестве параметра. Если ресурс результата не указан, то будет подразумеваться результат последнего запроса.

    $affected_num = cubrid_affected_rows();
    echo "Всего изменений: " . $affected_num;

    Полный список всех CUBRID PHP функций, сопоставленных с соответствующими функциями MySQL PHP, Вы можете посмотреть здесь, где Вы заметите, что почти все функции идентичны с учетом замены префикса mysql_ на cubrid_.

    Постоянные соединения

    В библиотеке CUBRID PHP постоянные соединения не реализованы по единственной причине того, что CUBRID сам поддерживает постоянные соединения. Т.е. Вы может задать в конфигурациях CUBRID Broker значение параметра CCI_PCONNECT [ссылка в мануал] как ON и перезапустить брокер, после чего все соединения между клиентским приложением и базой CUBRID буду постоянными, даже если Вы закроете их с помощью cubrid_close.

    Пул постоянных соединений может содержать максимум 256 соединений. Все остальные соединения будут открываться, как обычные, пока какой-либо из постоянных соединений не освободится. Также можно задать KEEP_CONNECTION.

    [%BROKER1]
    SERVICE = ON
    BROKER_PORT = 33000
    ...
    KEEP_CONNECTION = ON
    CCI_PCONNECT = ON
    STATEMENT_POOLING = ON

    Подготовленные запросы

    В библиотеке CUBRID PHP также можно задавать подготовленные запросы (prepared statements). Они могут включать как и "?", так и именные заполнители. Например:

    Применение ? в качестве заполнителя
    // ? в качестве заполнителя
    $sql = "SELECT * FROM game WHERE host_year = ?;

    $req = cubrid_prepare($conn, $sql);

    // порядковое связывание значений, начиная с 1
    cubrid_bind($req, 1, 2004);

    cubrid_execute($req);


    Применение именного заполнителя
    // именной заполнитель
    $sql2 = "SELECT * FROM game WHERE host_year = :host_year";

    $req = cubrid_prepare($conn, $sql);

    // также именное присвоение
    cubrid_bind($req, ':host_year', 2004);

    cubrid_execute($req);

    Все довольно просто. В конфигурациях CUBRID Broker есть еще один параметр STATEMENT_POOLING, который отвечает за пулинг подготовленных запросов. Если включить этот параметр (ON, OFF, по-умолчанию ON), то все подготовленные запросы будут сохранятся в специальном пуле, что позволяет их переиспользовать. Если отключить, то подготовленные запросы будут закрываться сразу после завершения транзакций.

    Итак, как Вы заметили, практически все, что работает с MySQL, будет работать и с CUBRID. А если у Вас что-то не сработает «из под коробки», пишите в комментариях. Разберемся. А может даже, благодаря Вам, в CUBRID PHP API будет что-то еще новенькое.
    CUBRID
    10,00
    Компания
    Поделиться публикацией

    Комментарии 12

      +1
      Вы бы взяли какой-то скрипт да провели в конце небольшое сравнительное тестирование. Типа вот у нас есть пхп скрипт (код скрипта), БД (структура, количество записей), при использовании mysql скрипт выполняется за н секунд, после замены mysql на cubrid скрипт выполняется за х секунд, что на р% быстрее/медленнее. А то так и непонятно нафига этот ваш CUBRID нужен.
        +1
        Целью этой статьи было показать как соединяться в PHP с CUBRID. Я не ставил задачи сравнить производительность разных библиотек. Но тем не менее спасибо Вам за комментарий. Я учту Ваше пожелание и в следующей статье обязательно напишу о производительности. Еще раз спасибо.
          0
          Месяц назад сравнивали скорость.
          habrahabr.ru/company/cubrid/blog/118074/
            0
            Там несколько другая цель была.
          0
          >Итак, как Вы заметили, практически все, что работает с MySQL, будет работать и с CUBRID.

          mysqli, pdo?
            0
            Думаю, автор имел ввиду SQL-синтаксис. PDO-драйвер под CUBRID существует.
              0
              PDO тоже. А вот mysqli нет, так как там немного другой синтаксис — все через экземпляр. Акцент на главный драйвер, используемый главными приложениями (Wordpress, Joomla, Yii и т.п.). Если смотреть на mysqli, то надо также создать уже отдельные драйвер, который можно будет использовать через экземпляр.
              0
              Существует ли объектная оболoчка для работу с этой СУБД? cubrid_connect() or die() выглядит в стиле PHP4 :(
                0
                имеете ввиду в стиле mysqli через экземпляр класса?
                  0
                  Да, или же ActiveRecord подход)
                    0
                    Как я написал выше, поддержка mysqli синтаксиса нет в планах. В этом пока нет необходимости вообще. Стабильность и производительность нынешнего CUBRID PHP API довольно хорошая, не устпает другим драйверам.

                    Для того, чтобы работать с ActiveRecord, можно использовать CUBRID PDO драйвер. Все, что Вы хотите, там есть. Вот туториал www.cubrid.org/cubrid_pdo_driver.

                    Дополнительно есть в планах разработать поддержку CUBRID в PHP ActiveRecord (phpactiverecord.org), а также в Doctrine (doctrine-project.org). Думаю, в этом году уже сделаем.

                    Спасибо за комментарий!
                      0
                      Вам спасибо :)

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое