Итак Вы, я уверен, уже знаете, как в 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.
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.
Все стандартно, но все происходит автоматически без Вашего участия. Этот же способ, но уже на английском и со скриншотами можете посмотреть здесь.
То же самое, что делает CUBRID PHP API Installer, Вы можете сделать сами.
Все готово!
Здесь мы покажем как установить CUBRID PHP драйвер в ОС Linux, основанных на DEBIAN. Для RPM основанных Linux смотрите инструкцию ниже.
Установка CUBRID PHP драйвера в ОС Linux, основанных на RPM.
Готово! Не забудьте перезапустить Веб сервер.
Установить CUBRID PHP драйвер можно и без phpize и PEAR — вручную. Смотрим инструкции ниже.
Готово! Если возникнут проблемы при установки драйвера, напишите в комментариях.
Как Вы, должно быть, знаете, подключение и работа с базами Oracle и PostgreSQL похожи в каком-то роде. Работая с ними, Вы напрямую подключаетесь к определенной базе, нежели к хосту или серверу в целом, как Вы обычно делаете в MySQL и MSSQL. В случае MySQL и MSSQL вы создаете соединение с хостом, затем второй шаг — выбираете базу, к которой Вам необходимо подсоединиться.
Работа с СУБД CUBRID в этом смысле похожа на Oracle и PostgreSQL. Вы напрямую подключаетесь к базе данных, с которым Вы хотите работать. Поэтому в CUBRID PHP, как и в Oracle и PostgreSQL, нет функций, которые позволяют создавать, удалять или выбирать базы данных, за исключением тех функций, которые выдают информацию о рабочей базе. Вот в этом они отличаются от библиотек MySQL и MSSQL.
По-умолчанию параметр auto_commit при подключении отключен, т.е. во всех следующих транзакциях Вы должны сами подтверждать транзакцию. Например:
Такая реализация очень удобна, если Вы хотите программно контролировать дальнейшие действия при ошибках в транзакциях (т.е. выдавать какие-то определенные сообщения и т.п.). Если предпочтете фиксировать все транзакции, можете включить auto_commit либо сразу при подключении, либо уже во время работы. В первом случае подсоединяйтесь через cubrid_connect_with_url.
Таким образом, все запросы будут фиксироваться автоматически. Во втором случае вызывайте функцию cubrid_set_autocommit в необходимый момент, например:
Точно также можно отключить auto_commit. Чтобы узнать статус auto_commit во время работы, Вы можете вызвать cubrid_get_autocommit.
Все остальные запросы в CUBRID очень похожи на синтаксис MySQL.
Для ввода нового или обновления старого значения, можно использовать те же функции, что и в MySQL, но уже с приставкой «cubrid_».
Чтобы получить 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, чтобы узнать сколько строк были изменены в результате, указанного в качестве параметра. Если ресурс результата не указан, то будет подразумеваться результат последнего запроса.
Полный список всех CUBRID PHP функций, сопоставленных с соответствующими функциями MySQL PHP, Вы можете посмотреть здесь, где Вы заметите, что почти все функции идентичны с учетом замены префикса mysql_ на cubrid_.
В библиотеке CUBRID PHP постоянные соединения не реализованы по единственной причине того, что CUBRID сам поддерживает постоянные соединения. Т.е. Вы может задать в конфигурациях CUBRID Broker значение параметра CCI_PCONNECT [ссылка в мануал] как ON и перезапустить брокер, после чего все соединения между клиентским приложением и базой CUBRID буду постоянными, даже если Вы закроете их с помощью cubrid_close.
Пул постоянных соединений может содержать максимум 256 соединений. Все остальные соединения будут открываться, как обычные, пока какой-либо из постоянных соединений не освободится. Также можно задать KEEP_CONNECTION.
В библиотеке CUBRID PHP также можно задавать подготовленные запросы (prepared statements). Они могут включать как и "?", так и именные заполнители. Например:
Применение ? в качестве заполнителя
Применение именного заполнителя
Все довольно просто. В конфигурациях CUBRID Broker есть еще один параметр STATEMENT_POOLING, который отвечает за пулинг подготовленных запросов. Если включить этот параметр (ON, OFF, по-умолчанию ON), то все подготовленные запросы будут сохранятся в специальном пуле, что позволяет их переиспользовать. Если отключить, то подготовленные запросы будут закрываться сразу после завершения транзакций.
Итак, как Вы заметили, практически все, что работает с MySQL, будет работать и с CUBRID. А если у Вас что-то не сработает «из под коробки», пишите в комментариях. Разберемся. А может даже, благодаря Вам, в CUBRID PHP API будет что-то еще новенькое.
Сразу оговорюсь, что речь будет идти о 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, Вы можете сделать сами.
- Скачайте необходимый для Вас драйвер с оффициального сайта (< 40КБ). Доступны как и thread-safe, так и non-thread-safe версии для Apache и IIS.
- Распакуйте архив.
- Скопируйте php_cubrid.dll в папку, где лежат Ваши остальные PHP драйвера.
- Откройте конфигурационный файл php.ini и вставьте в конце файла вышеуказанные две строчки.
- Сохраните измененния и перезапустите свой Веб сервер.
Все готово!
Установка PHP Драйвера в ОС Linux с помощью Исталлятора PECL
Здесь мы покажем как установить CUBRID PHP драйвер в ОС Linux, основанных на DEBIAN. Для RPM основанных Linux смотрите инструкцию ниже.
- Устанавливаем phpize
sudo apt-get install php5-dev
- Устанавливаем пакет PEAR, который предоставляет команды PECL
sudo apt-get install php-pear
- Теперь устанавливаем сам 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.
- В конце Вам необходимо изменить конфигурационный файл php.ini, добавив следующие две строчки в конце файла.
[CUBRID]
extension=cubrid.so
Установка CUBRID PHP драйвера в ОС Linux, основанных на RPM.
- Устанавливаем phpize
yum install php-devel
- Скачиваем пакет PEAR
wget pear.php.net/go-pear.phar
- Запускаем пакет PEAR в PHP
php go-pear.phar
- Теперь устанавливаем сам 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.
- В конце Вам необходимо изменить конфигурационный файл php.ini, добавив следующие две строчки в конце файла.
[CUBRID]
extension=cubrid.so
Готово! Не забудьте перезапустить Веб сервер.
Ручная конфигурация php.ini в ОС Linux
Установить CUBRID PHP драйвер можно и без phpize и PEAR — вручную. Смотрим инструкции ниже.
- Скачайте необходимый для Вас драйвер с оффициального сайта (< 80КБ). Доступны версии как и для x64, так и для x86.
- Распакуйте архив.
- Скопируйте cubrid.so в директорию, где лежат Ваши остальные PHP драйвера (обычно это /usr/lib/php5/20090626 для PHP 5.3.3, где 20090626 название директории, которая может изменяться в зависимости от версии PHP).
- Откройте конфигурационный файл php.ini (обычно находится в /etc/php5/apache2/php.ini) и вставьте в конце файла следующие две строчки.
[CUBRID]
extension=cubrid.so
- Сохраните измененния и перезапустите свой Веб сервер.
Готово! Если возникнут проблемы при установки драйвера, напишите в комментариях.
Работа с драйвером 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 будет что-то еще новенькое.