Меню Рубрики

Php oracle pdo windows

Функции Oracle (PDO_OCI)

Установка

Если база данных Oracle находится на том же компьютере, что и PHP, программное обеспечение базы данных уже содержит необходимые библиотеки. Если PHP находится на другом компьютере, используйте бесплатные библиотеки » Oracle Instant Client. Подробнее смотрите в требованиях OCI8.

Для установки расширения PDO Oracle OCI используйте опцию —with-pdo-oci[=DIR], , где [=DIR] — необязательное значение, указывающее на домашнюю директорию Oracle. По умолчанию [=DIR] принимает значение переменной окружения $ORACLE_HOME .

Используйте опцию —with-pdo-oci=instantclient,prefix,version Для Oracle Instant Client SDK , с указанными префиксом и версией.

Предопределенные константы

Перечисленные ниже константы определены данным драйвером и будут доступны только в случае, если PHP был собран с поддержкой этого расширения или данное расширение было подгружено динамически во время выполнения. Вдобавок, эти драйверо-зависимые константы должны быть использованы только совместно с этим драйвером. Использование атрибутов, специфичных для некоторого драйвера с другим драйвером может вызвать неожиданное поведение. Если ваш код выполняется с несколькими драйверами, то можно использовать функцию PDO::getAttribute() для получения атрибута PDO::ATTR_DRIVER_NAME для проверки драйвера.

PDO::OCI_ATTR_ACTION ( integer )

Позволяет задать действие для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_CLIENT_INFO ( integer )

Позволяет задать информацию по клиенту для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_CLIENT_IDENTIFIER ( integer )

Позволяет задать идентификатор клиента для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

PDO::OCI_ATTR_MODULE ( integer )

Позволяет задать модуль для сессии.

Существует, начиная с PHP 7.2.16 и 7.3.3

Содержание

User Contributed Notes 13 notes

if oracle and oracle instant client has been installed,
without db in the same host

For UNIX/LINUX,set $LD_LIBRARY_PATH
appent your instant client path and client/lib path to it,

For windows set PATH like this

After set the path ,set TNS_ADMIN everioment ,point to
where tnsnames.ora located.

Then,you can use service name to connect to your Database

= $_POST ;
$db_username = «youusername» ;
$db_password = «yourpassword» ;
$db = «oci:dbname=yoursid» ;
$conn = new PDO ( $db , $db_username , $db_password );
$name = $param [ ‘module’ ];
$file = $param [ ‘file’ ];
$stmt = $conn -> exec ( «INSERT INTO AL_MODULE (AL_MODULENAME, AL_MODULEFILE) VALUES (‘ $name ‘, ‘ $file ‘)» );

If you’re getting the «I’m too dumb to find oci.h» error, try creating a variety of paths. One variety uses just the major and minor of your OIC version (eg, 11.2 for 11.2.0.2) and another variety uses client64 as well as client.

Something like this (for 11.2.0.2):
ln -s /usr/include/oracle/11.2.0.2/ /usr/include/oracle/11.2
ln -s /usr/include/oracle/11.2/client /usr/include/oracle/11.2/client64
ln -s /usr/lib/oracle/11.2.0.2/ /usr/lib/oracle/11.2
ln -s /usr/lib/oracle/11.2/client /usr/lib/oracle/11.2/client64

This should cover your bases for 64-bit systems, as well as PHP patched to use the major.minor version number only. See also PHP bug #44989.

To enable PDO support on PHP for Oracle Instant Client 11.1.x, you should follow the syntax above in the compile command, just as pointed by Andrew http://bugs.php.net/bug.php?id=39312, taking by default you have installed the OIC at /usr/lib/oracle (instant client and sdk at subfolder):

Just saying your release version from the Oracle OIC.

It compiles fine then.

Notice the red block at the beginning of this page. pdo_oci is HIGHLY experimental.

Even though it is under dev from 2004, it lakes today support for things that _do_ matters :
— bind a varchar2 of 3500 chars
— get selected metas
— left join with blobs/clobs
— etc.

For the story, since we use pdo_pgsql in our software, I thought it would be viable to use pdo_oci for running under Oracle. After a long battle, I finally won :

1) If requested driver has a non-experimental pdo version available, use it.
2) else (well, for pdo_oci at least), use an abstraction layer of your own.
3) you’re done.

What I did in more details.

2 «main» classes for being compliant with «$obj instanceof PDO» or such :
— class PhpDb extends PDO
— class PhpDbStatement extends PDOStatement
2 «abstract» classes that defines what PDO actually does :
— abstract class PhpDbAbstract
— abstract class PhpDbAbstractStatement
And at last for each driver, 2 classes doing the abstraction :
— class PhpDbDriverOracle extends PhpDbAbstract
— class PhpDbDriverOracleStatement extends PhpDbAbstractStatement

«main» classes are accessed from your script, simply replace «new PDO» with «new PhpDb».
«abstract» classes are mainly there for the documentation :p
«driver» classes do the job in background, they are instances by the main classes.

My PhpDb will be in an open source project sooner or later, search google or mail me !

If instant client has been installed but the full oracle client
not yet ,you can use pdo to connect to oracle database
like following coding:

= »
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = yourip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
» ;
$db_username = «youname» ;
$db_password = «yourpassword» ;
try <
$conn = new PDO ( «oci:dbname=» . $tns , $db_username , $db_password );
>catch( PDOException $e ) <
echo ( $e -> getMessage ());
>
?>

Take note of the note at the top, this really is an experimental extension. I had a problem trying to read data from Oracle which resulted in some strange behaviour in PHP. i.e. foreach loops not ending, with no error messages. I also managed to get the data from Oracle into an array in PHP, but then couldn’t return the array from a function.

After pulling my hair out for a day, it turned out to be a CLOB column in Oracle that caused the strange behaviour in PHP. I assume this extension doesn’t fully support them.

Instead I’ve typecast it within the SQL to a VARCHAR2 which seems to resolve it:

SELECT CAST(columnx AS VARCHAR2(4000)) AS columnx .

It might help someone else having similar issues.

Источник

PHP PDO installation on windows (xampp)

I am trying to develop a web app that can connect to as many different databases as possible on PHP. PDO (http://www.php.net/manual/en/book.pdo.php) seems to be the right interface for it but I am having trouble installing all the extentions needed for all the different PDO database drivers that I need.

Please note that I use xampp on a windows 7 machine. PHP Version 5.3.8. PDO drivers enabled mysql, odbc, sqlite, sqlite2, sqlsrv.

I have successfully connected with the following:

  • MySQL using PDO_MYSQL [MySQL (PDO) ] (extension seemed to be installed on xampp by default)
  • Microsoft SQL Server using PDO_SQLSRV [MS SQL Server (PDO)] (followed the instractions on http://craigballinger.com/blog/2011/08/usin-php-5-3-with-mssql-pdo-on-windows/)

I had no luck installing or connecting with:

  • (SOLVED SEE BELOW UPDATES) Sybase (I tried to use and install PDO_DBLIB [MS SQL Server (PDO)]but with no luck)
  • (SOLVED SEE BELOW UPDATES)Oracle (I tried to enable the extension=php_pdo_oci.dll in php.ini with the dll that was installed with xampp after restarting Apache the server failed to start. Was trying to use PDO_OCI [Oracle (PDO)])

I know I can work around those 2 with using the database specific drivers but I would really love to use PDO for everything that I need.

Does anyone know how to install and enable PDO_DBLIB and PDO_OCI drivers or a windows machine, or any other way of connecting with Sybase and Oracle databases using PDO?

UPDATE

Just succesfully connected with oracle with PDO_OCI. What you need to do is the following:

Download and install the proper Oracle Instant Client on your windows machine for example instantclient_12_1 and add its path to PATH in SYSTEM Environmental Variables. Note Oracle supports only 2 versions down so select your client version properly. Do that and then restart your Apache. Note that the connection string is very different from here is a sample of what I used:

UPDATE

Just connected with Sybase as well with PDO_ODBC. What you need is the following:

Must have Sybase ASE ODBC Driver which comes with the SDK. Find below the connection string used:

Источник

Установка расширений OCI8 и PDO_OCI для PHP5

В настоящее время я работаю в компании, которая очень любит использовать в проектах на PHP СУБД Oracle, причем иногда версии 11g.

Большая часть разработчиков этой компании работает под ОС Windows. За последний месяц несколько из них решили приобщиться к Linux и поставили себе Ubuntu. По прошествии нескольких дней после установки самой ОС, ребята столкнулись с задачей установки драйверов PHP для работы с СУБД Oracle — OCI8 и PDO_OCI на базе Oracle instant client 11.2, которую не смогли решить самостоятельно.

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

Мануал написан для пользователей Ubuntu Linux, но с некоторыми изменениями подойдет для пользователей большинства Linux’ов.

Подготовка к установке

Установка Oracle instant client

Скачиваем instant client Oracle с официального сайта http://oracle.com для своей архитектуры процессора и ОС.
Для Linux instant client поставляется в двух вариантах:

  • RPM пакет — Linux, CentOS, Fedora, Red Hat Enterprise Linux, Mandriva Linux, SUSE Linux и д.р. у кого есть поддержка RPM;
  • ZIP архив — всем остальным.

Необходимо скачать 2 файла:

  • instantclient-basic — сам Oracle instant client
  • instantclient-sdk — набор библиотек для разработки приложений под Oracle instant client

Также можете скачать:

  • instantclient-sqlplus — SQL*Plus

Создаем директорию, в которой будут лежать файлы Oracle instant client (каталог /opt, зарезервированный для дополнительных пакетов программного обеспечения, хорошо для этого подходит):
sudo mkdir -p /opt/oracle/

Перемещаем скачанные файлы в /opt/oracle и переходим в папку назначения (допустим что вы скачали «zip архивы» в папку «downloads» Вашего пользователя):
sudo mv

/downloads/instantclient-*.zip /opt/oracle/
cd /opt/oracle/

Разархивируем все скачанные архивы:
sudo unzip instantclient-basic-*-*.zip
sudo unzip instantclient-sdk-*-*.zip
Если вы скачивали SQL*Plus:
sudo unzip instantclient-sqlplus-*-*.zip

В итоге в каталоге /opt/oracle был создан, для Oracle instant client 11.2.0.2.0, каталог instantclient_11_2. Переименуем этот каталог в instantclient (если у вас другая версия/каталог измените команду) и перейдем в него:
sudo mv instantclient_11_2 instantclient
cd instantclient

Далее необходимо создать несколько дополнительных каталогов и символьных ссылок для нормальной работы клиента (обратите внимание на версию и если она у вас другая измените команды):
sudo ln -s /opt/oracle/instantclient/libclntsh.so.* /opt/oracle/instantclient/libclntsh.so
sudo ln -s /opt/oracle/instantclient/libocci.so.* /opt/oracle/instantclient/libocci.so
sudo ln -s /opt/oracle/instantclient/ /opt/oracle/instantclient/lib

sudo mkdir -p include/oracle/11.2/
cd include/oracle/11.2/
sudo ln -s ../../../sdk/include client
cd —

sudo mkdir -p lib/oracle/11.2/client
cd lib/oracle/11.2/client
sudo ln -s ../../../ lib
cd —

Создаем конфигурационный файл, в котором будет указан каталог для поиска библиотек Oracle instant client, и подключаем его:
echo /opt/oracle/instantclient/ | sudo tee -a /etc/ld.so.conf.d/oracle.conf
sudo ldconfig

Так как в Ubuntu нет каталога /usr/include/php, а клиент его все равно ищет создадим символьную ссылку на его эквивалент php5:
sudo ln -s /usr/include/php5 /usr/include/php

Устанавливаем OCI8

После всех наших манипуляций расширение oci8 замечательно устанавливается с помощью команды pecl:
sudo pecl install oci8
нас просят ввести путь к Oracle instant client, на что необходимо ответить:
instantclient,/opt/oracle/instantclient

Создаём файл подключения расширения:
echo «; configuration for php oci8 module» | sudo tee /etc/php5/conf.d/oci8.ini
echo extension=oci8.so | sudo tee -a /etc/php5/conf.d/oci8.ini

Устанавливаем PDO_OCI

Для установки PDO_OCI нам сначала необходимо его скачать из репозитория pear.
Обновим список пакетов pear:
sudo pecl channel-update pear.php.net

Скачаем и поместим архив во временную директорию:
sudo mkdir -p /tmp/pear/download/
cd /tmp/pear/download/
sudo pecl download pdo_oci

Извлечем содержимое архива и перейдем к нему:
sudo tar xvf PDO_OCI*.tgz
cd PDO_OCI*

Здесь нам необходимо скорректировать файл config.m4, так как в нем нет данных о нашей версии Oracle instant client, последние изменения датируются 2005 годом. Запускаем любимый редактор и вносим изменения отмеченные «+» (обратите внимание на версию и если она у вас другая измените строчки):
sudo vim config.m4

Далее приведен diff двух файлов:
***************
*** 7,12 ****
— 7,14 —-
if test -s «$PDO_OCI_DIR/orainst/unix.rgs»; then
PDO_OCI_VERSION=`grep ‘»ocommon»‘ $PDO_OCI_DIR/orainst/unix.rgs | sed ‘s/[ ][ ]*/:/g’ | cut -d: -f 6 | cut -c 2-4`
test -z «$PDO_OCI_VERSION» && PDO_OCI_VERSION=7.3
+ elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.11.2; then
+ PDO_OCI_VERSION=11.2
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.10.1; then
PDO_OCI_VERSION=10.1
elif test -f $PDO_OCI_DIR/lib/libclntsh.$SHLIB_SUFFIX_NAME.9.0; then
***************
*** 119,124 ****
— 121,129 —-
10.2)
PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
;;
+ 11.2)
+ PHP_ADD_LIBRARY(clntsh, 1, PDO_OCI_SHARED_LIBADD)
+ ;;
*)
AC_MSG_ERROR(Unsupported Oracle version! $PDO_OCI_VERSION)
;;
***************

Подготавливаем окружение для расширения php c помощью команды phpize (обратите внимание на версию, если она у вас другая измените):
sudo phpize

Конфигурируем установщик пакета и устанавливаем пакет (обратите внимание на версию, если она у вас другая измените):
sudo ./configure —with-pdo-oci=instantclient,/opt/oracle/instantclient/,11.2
sudo make
sudo make install

Создаём для него файл подключения:
echo «; configuration for php PDO_OCI module» | sudo tee /etc/php5/conf.d/pdo_oci.ini
echo extension=pdo_oci.so | sudo tee -a /etc/php5/conf.d/pdo_oci.ini

Подводим итоги

Перезапускаем apache и проверяем наличие установленных расширений:
sudo /etc/init.d/apache2 restart
php -m

Заключение

Мануал основан на вот этом посте, который был несколько переработан — исправлены ошибки и внесены дополнения.

Надеюсь, статья будет полезной не только моим коллегам по работе.

Редакторский дайджест

Присылаем лучшие статьи раз в месяц

Скоро на этот адрес придет письмо. Подтвердите подписку, если всё в силе.

Похожие публикации

Еще десять тысяч ПК мигрировали на Ubuntu Linux

Установка Ubuntu Linux с винчестера. Скрипт

Неприятная особенность Ubuntu Linux для системных администраторов

Средняя зарплата в IT

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

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

Спасибо за подробную инфу.

А под Windows, подскажите:
1) Для разработки стоит ли ставить на свою же машину Standard/Enterprise Edition или она требует много ресурсов и все будет тормозить? (Express не подходит, так как там нет поддержки Java)

2) Под Windows 7 64bit, если сталкивались, то подойдут ли драйвера Oracle 64 bit? А то я ставил и ничего не вышло, PHP не хотел коннектиться, пока не поставил 32 битные.

1. Разнице в потреблении ресурсов между Express и Stadndard/Enterprise Edition нет. В Express просто ограничения на кол-во используемых ресурсов для базы.

2. 32 битные приложения требуют 32 битных драйверов, 64 битные — 64 битных 😉

1. То есть, S/E Edition позволит мне нормально работать на том же самом компьютере?

2. Уточните ответ, пожалуйста.

2. www.viva64.com/ru/l/0002/ — тут подробнее.
А насчет PHP — в Windows обычно берут бинарные сборки, а в них библиотеки уже собраны под конкретную версию оракловой библиотеки, и с другими версиями оно работать не будет.
Для 64х битной оракловой библиотеки надо 64х битную версию PHP, а их готовых под Windows на официальном сайте я не видел. Ну и до кучи надо будет еще 64 битную версию Apache или другого веб-сервера.

Я пока собирал, наткнулся на множество проблем в компиляции и еще много чего.

В общем я так психовал последний раз когда играл в денди

Да, Сбер хорошо апгрейднулся в лучшую сторону. Но мой пост был не об этом, а о том, что размер компании — это в первую очередь признак пропиаренности среди гос. контор и крупных заказчиков, но никак не признак качественного технического исполнения. Чем крупней заказчик, тем дальше находится человек, принимающий бизнес решения от технарей, которые «как-нибудь этот бампер да прикрутят».

Чем больше узнаю про оракл, тем больше он у меня начинает ассоциироваться с коболом и мэйнфреймами. Сугубо по области своего применения/популярности.

>подойдет для пользователей большинства Linux’ов.

для пользователей RHEL/CentOS на сайте оракла есть готовые RPM
ставите instantclient (http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html) и сам пакет с модулем ( oss.oracle.com/projects/php/ )

The PDO_OCI driver for the PDO extension is not currently included.

If support is needed, use Zend Server.

Немного комментариев с моей стороны (правда, я джавист), т.к. я использую оракл на локальной машине уже довольно давно (около 4 лет).

У нас (под Windows XP x32) используют локальный оракл 10g / 11g Enterprise Edition (standard не подходит из-за отсутствия ряда нужных фич), проблем не наблюдается.

Типично он потребляет памяти где то 250-300 мегабайт (что меньше чем, например, Google Chrome c тремя десятками вкладок:))), при более интенсисной обработке данных — бывает до 500 метров. Нагрузка на процессор обычно вообще не заметна (может проявится только если у вас много сложной логике в хранимых процедурах, и самих данных много).

На машинах класса Core2Duo / Quad с 3-4 гигами памяти локальный оракл совершенно не обременителен. На этих же машинах локально еще работают JBoss, Eclipse (и Google Chrome, который по моему ест памяти больше чем все выше перечисленное вместе взятое).

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

Укажу только несколько мелочей, который имеет смысл помнить при работе с локальной базой (когда вы сами себе DBA), они в общем-то общеизвестны, но о них часто забывают. Итак:

— Если вы часто и много (миллионы записей и больше) вставляете и удаляете данных из какой-то таблицы (например, тестируете какие-то интеграционные интерфейсы для загрузки данных из CSV / XML или что-то такое), помните о таком понятии, как Table HWM (high water mark). Переодически не забываете делать не просто delete, а truncate. Кроме того, при очень частой вставке / удалении большого количества записей, следите за размером redo-логов и датафайла с UNDO тейблспейсом.

— Для таблиц, на которые есть активные ссылающиеся внешние ключи из других таблиц, перед тем как можно будет делать truncate, придется пройтись сначала по схеме и отключить все ссылающиеся на таблицу внешние ключи (даже если нет реальных записей, ссылающихся на какие-то данные, сам факт наличия active внешнего ключа не даст сделать truncate).

— Если не следить на местом на диске, то с течением времени оракл может легко отъесть 30-40 гигабайт на диске, даже если у вас нет схем с большим объемом данных. Для борьбы с этим, из простейших методов, не забывайте стирать старые ненужные схемы (т.е. юзеров), и следить за тейблспейсами. Иногда может потребоваться сделать shrink tablespace самому. Неожиданно много места может съедать UNDO tablespace.

Если еще какие то типичные вещи вспомню, напишу.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

  • Php openssl gost windows
  • Php ldap windows 7
  • Php json encode windows 1251
  • Php installer windows msi
  • Php installer windows installer