Как подключиться к OpenEdge через ODBC из PHP
За последние пару-другую недель, получал несколько обращений по вопросу возможности подключения к базе данных OpenEdge через ODBC из PHP. Поскольку в преддверие праздников писать какую-то большую статью на тему «как наши корабли бороздят просторы вселенной» нет никакого желания, то решил подготовить небольшую простенькую инструкцию, которая для кого-то, быть может, станет отправной точкой в изучении этого вопроса.
Итак, имеем:
- CentOS 5.10 32-bit
- OpenEdge 10.x 32-bit
- Используем 32- битный ODBC- драйвер, установленный во время инсталляции OpenEdge. Также прошу обратить внимание, что 64-битный драйвер ODBC для OpenEdge для Linux доступен только начиная с версии OpenEdge 11.0.
- В качестве веб-сервера используем Apache HTTP server
Задача:
- Настроить возможность подключения к OpenEdge из PHP
Создаем OpenEdge-базу данных для тестов
$ proenv proenv>prodb demodb demo proenv>proserve demodb -S 50501
Создаем sql-пользователя в базе demodb:
proenv>mpro demodb
Меню: F3 -> Tolls -> Data Dictionary -> Admin -> Security -> Edit User List
Создайте пользователя sysprogress и установите ему пароль. Пользователь Sysprogress, это учетная запись SQL-администратора, которая по умолчанию имеет доступ ко всем таблицам БД на уровне SQL. Если вы решите использовать другое имя, то необходимо выдать такой учетной записи соответствующие SQL-права.
Настраиваем CentOS
Убедитесь, что у вас установлен пакет unixODBC, если нет, установите его (под root)
yum install unixODBC
Под CentOS 5.6 и выше рекомендуется использовать следующие пакеты PHP 5.3: php53 и php53-odbc, которые могут быть установлены из репозитория CentOS. Для обновления, или установки PHP 5.3 выполните следующие команды:
sudo /sbin/service httpd stop sudo yum remove php sudo yum remove php-odbc sudo yum remove php-common sudo yum update sudo yum install php53 sudo yum install php53-odbc sudo /sbin/service httpd start cp /usr/dlc102B/odbc/lib/libodbcinst.so /usr/lib/libodbcinst.so cp /usr/dlc102B/odbc/lib/libpgcrypto23.so /usr/lib/libpgcrypto23.so cp /usr/dlc102B/odbc/lib/libpgicu23.so /usr/lib/libpgicu23.so cp /usr/dlc102B/odbc/lib/libpgmback.so /usr/lib/libpgmback.so cp /usr/dlc102B/odbc/lib/libpgssl23.so /usr/lib/libpgssl23.so cp /usr/dlc102B/odbc/lib/odbccurs.so /usr/lib/odbccurs.so cp /usr/dlc102B/odbc/lib/odbctrac.so /usr/lib/odbctrac.so cp /usr/dlc102B/odbc/lib/pgoe1023.so /usr/lib/pgoe1023.so cp /usr/dlc102B/odbc/lib/vscnctdlg.so /usr/lib/vscnctdlg.so
Примечание. Цифры (23) в именах библиотек могут отличаться от версии к версии OpenEdge 10.x.
Настройка ODBC
Отредактируйте файл /etc/odbc.ini, если такого файла нет, то создайте его:
[ODBC Data Sources] Progress=Progress_SQL92_Driver [Progress] Driver=/usr/dlc102B/odbc/lib/pgoe1023.so DatabaseName=demodb PortNumber=50501 HostName=localhost LogonID=sysprogress Password=123 APILevel=1 ConnectFunctions=YYN CPTimeout=60 DriverODBCVer=03.60 FileUsage=0 SQLLevel=0 UsageCount=1 ArraySize=50 DefaultLongDataBuffLen=2048 DefaultIsolationLevel=REPEATABLE READ StaticCursorLongColBuffLen=4096 TRACE=1 TRACEFILE=/tmp/odbctrace.out [ODBC] InstallDir=/usr/dlc102B/odbc Trace=1 TraceFile=/tmp/odbctrace.out TraceDll=/usr/dlc102B/odbc/lib/odbctrac.so UseCursorLib=0
Отредактируйте файл /etc/odbcinst.ini, если такого файла нет, то создайте его:
[ODBC Drivers] Description = Progress driver [Progress OpenEdge 10.2B Driver] Driver=/usr/dlc102B/odbc/lib/pgoe1023.so FileUsage = 1
Чтобы проверить правильность настройки, выполните:
export LD_LIBRARY_PATH=/usr/dlc102B/odbc/lib:/usr/dlc102B/lib export ODBCINI=/etc/odbc.ini isql -v Progress sysprogress 123
Результат должен быть следующим:
+---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
Введите следующий запрос:
select * from PUB.customer
В результате на экран должны быть выведены записи таблицы customer.
Создайте php-файл с любым именем, например, test.php и поместите в него следующий код:
<!PHP Print "Test ODBC Progress "; $dsn = "Progress"; putenv("LD_LIBRARY_PATH=/usr/dlc102B/odbc/lib:/usr/dlc102B/lib"); putenv("ODBCINI=/etc/odbc.ini"); Print "Test ODBC Progress "; $sql="SELECT * FROM PUB.Customer"; if ($conn_id=odbc_connect("Progress","sysprogress","123", SQL_CUR_USE_ODBC)){ echo "connected to DSN: $dsn "; if($result=odbc_do($conn_id, $sql)) { echo "executing '$sql'"; echo " Results: "; odbc_result_all($result, "BGCOLOR='#AAFFAA' border=3 width=30% bordercolordark='#FF0000'"); echo "freeing result"; odbc_free_result($result); }else{ echo "can not execute '$sql' "; } echo " closing connection $conn_id"; odbc_close($conn_id); }else{ echo " can not connect to DSN: $dsn "; } ?>
Поместите его в каталоге веб-сервера, например, /var/www/html/ или /usr/local/apache2/htdocs/.
Проверьте работу php-файла в веб-браузере http://localhost/test.php, результат должен выглядеть так:
Поздравляю! У вас всё получилось!
Будут вопросы, пишите в комментариях.
Есть вопрос? Спросите...
Для отправки комментария вам необходимо авторизоваться.
3 Комментария
Здравствуйте. Хорошая статья. Только еще не хватает переменных некоторых . Хорошо бы добавить
putenv (“DLC=/usr/dlc”);
putenv (“ODBCINST=/home/apostol/odbcinst.ini”);
putenv (“ODBCINI=/home/apostol/odbc.ini”);
putenv (“LD_LIBRARY_PATH=/usr/dlc/odbc/lib”);
а то без них не всегда работает.
Подскажите еще момент, не сталкивались, что два соединения одновременных не работают вместе? Рушится предыдущее соединение.
Спасибо за дополнение!
Увы, не сталкивался.
Но возможно, если вы сможете подготовить подробный пример для стандартной базы Sports, то я или кто-нибудь из читателей сможем воспроизвести ситуацию, и проанализировав найти ответ и возможное решение.
В некоторых случаях символы кириллицы в качестве возвращаемого результата из базы данных могут отображаться некорректно или вообще может возвращаться пустая строка.
В таких ситуациях нужно явно указать ODBC с какой кодировкой он должен работать. Для примера, если база данных в кодировке 1251, то в файле odbc.ini в секции [ODBC] укажите параметр IANAAppCodePage=2251. Этот параметр отвечает за кодовую страницу, 2251 соответствует кодировке win1251.
Ссылка на статью Progress Knowledge Base “How to define code pages in the odbc.ini file on Unix?” http://knowledgebase.progress.com/articles/Article/000040215
Допустимые значения IANAAppCodePage
http://media.datadirect.com/download/docs/slnk/admin/appcodepage.html