(PHP 5, PHP 7, PHP 8, PECL OCI8 >= 1.1.0)
oci_connect — Устанавливает соединение с базой данных Oracle
$username
,$password
,$connection_string
= null
,$encoding
= "",$session_mode
= OCI_DEFAULT
Возвращает идентификатор соединения, который используется большинством функций данного модуля.
Для повышения производительности большинство приложений должны использовать постоянные соединения с помощью oci_pconnect() вместо oci_connect(). Смотрите Управление соединением для более детальной информации по управлению соединениями и создании пулов подключений.
Второй и последующие вызовы функции oci_connect() с теми же параметрами вернут идентификатор уже открытого соединения. Это означает, что транзакции используют одно и то же базовое соединение с базой данных. При необходимости разделения транзакций рекомендуется использовать функцию oci_new_connect().
username
Имя пользователя Oracle.
password
Пароль username
.
connection_string
Содержит
экземпляр Oracle
для подключения. Это может быть
» Easy Connect
string, или Connect Name из файла
tnsnames.ora, или имя локального экземпляра Oracle.
Если не указано отдельно или null
, PHP использует
переменные окружения, такие как TWO_TASK
(на Linux)
или LOCAL
(на Windows)
и ORACLE_SID
для определения
экземпляра Oracle
для соединения.
Для использования метода Easy Connect, PHP должен быть слинкован с клиентскими библиотеками версии Oracle
10g или старше. Easy Connect string для Oracle 10g принимает следующую форму:
[//]host_name[:port][/service_name]. Начиная с Oracle 11g синтаксис таков:
[//]host_name[:port][/service_name][:server_type][/instance_name].
В Oracle 19c были введены дополнительные параметры, включая настройки времени ожидания и проверки активности.
Обратитесь к документации Oracle. Названия служб могут быть определены с помощью запуска Oracle утилиты lsnrctl status
на сервере базы данных.
Файл tnsnames.ora может находиться в поисковом пути Oracle Net, который включает
/your/path/to/instantclient/network/admin,
$ORACLE_HOME/network/admin и /etc. В качестве альтернативного варианта
можно установить TNS_ADMIN
таким образом, чтобы путь $TNS_ADMIN/tnsnames.ora был читаемым.
Убедитесь, что веб-сервер имеет доступ к этому файлу.
encoding
Определяет кодировку, которую будут использовать клиентские библиотеки Oracle. Кодировка не обязательно должна совпадать с кодировкой самой базы данных. Oracle сделает всё возможное, чтобы преобразовать данные из или в эту кодировку, если кодировка не совпадает. В зависимости от кодировок это не всегда даёт приемлемые результаты. Преобразование также занимает некоторое время.
Клиентские библиотеки Oracle будут определять кодировку из переменной окружения NLS_LANG
,
если кодировку не указали.
Передача аргумента часто уменьшает время, которое тратится на соединение.
session_mode
Параметр доступен
с PHP 5 (PECL OCI8 1.1) и принимает следующие значения: OCI_DEFAULT
,
OCI_SYSOPER
и OCI_SYSDBA
. Если указали
OCI_SYSOPER
или OCI_SYSDBA
, функция попытается установить
привилегированное соединение через внешние данные авторизации. По умолчанию привилегированные
соединения отключены. Чтобы их включить, устанавливают
oci8.privileged_connect
в On
.
В версии PHP 5.3 (PECL OCI8 1.3.4) появилась константа OCI_CRED_EXT
как значение режима.
Этот режим говорит Oracle использовать внешнюю аутентификацию или аутентификацию операционной системы,
которую требуется настроить в базе данных.
Флаг OCI_CRED_EXT
разрешается использовать только с именем пользователя "/"
и пустым паролем.
Опиция oci8.privileged_connect принимает
значение On
или Off
.
Режим OCI_CRED_EXT
разрешается объединять с режимами OCI_SYSOPER
и OCI_SYSDBA
.
Режим OCI_CRED_EXT
не поддерживается в Windows по соображениям безопасности.
Возвращает идентификатор соединения или false
в случае возникновения ошибки.
Версия | Описание |
---|---|
8.0.0, PECL OCI8 3.0.0 |
connection_string теперь допускает значение null.
|
Пример #1 Пример использования oci_connect() с синтаксисом Easy Connect
<?php
// Подключается к XE сервису (т.е. к базе данных) на "localhost"
$conn = oci_connect('hr', 'welcome', 'localhost/XE');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
Пример #2 Пример использования oci_connect() используя имя Network Connect
<?php
// Соединяется с базой данных MYDB описанной в файле tnsnames.ora,
// Пример записи в tnsnames.ora для MYDB:
// MYDB =
// (DESCRIPTION =
// (ADDRESS = (PROTOCOL = TCP)(HOST = mymachine.oracle.com)(PORT = 1521))
// (CONNECT_DATA =
// (SERVER = DEDICATED)
// (SERVICE_NAME = XE)
// )
// )
$conn = oci_connect('hr', 'welcome', 'MYDB');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
Пример #3 Пример использования oci_connect() с использованием определённого набора символов
<?php
$conn = oci_connect('hr', 'welcome', 'localhost/XE', 'AL32UTF8');
if (!$conn) {
$e = oci_error();
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$stid = oci_parse($conn, 'SELECT * FROM employees');
oci_execute($stid);
echo "<table border='1'>\n";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
echo "<tr>\n";
foreach ($row as $item) {
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";
?>
Пример #4 Пример использования многократных вызовов oci_connect()
<?php
$c1 = oci_connect("hr", "welcome", 'localhost/XE');
$c2 = oci_connect("hr", "welcome", 'localhost/XE');
// $c1 и $c2 содержат одинаковый PHP id ресурса, что означает, что
// они используют одинаковое базовое соединение
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";
function create_table($conn)
{
$stmt = oci_parse($conn, "create table hallo (test varchar2(64))");
oci_execute($stmt);
echo "Created table<br>\n";
}
function drop_table($conn)
{
$stmt = oci_parse($conn, "drop table hallo");
oci_execute($stmt);
echo "Dropped table<br>\n";
}
function insert_data($connname, $conn)
{
$stmt = oci_parse($conn, "insert into hallo
values(to_char(sysdate,'DD-MON-YY HH24:MI:SS'))");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname inserted row without committing<br>\n";
}
function rollback($connname, $conn)
{
oci_rollback($conn);
echo "$connname rollback<br>\n";
}
function select_data($connname, $conn)
{
$stmt = oci_parse($conn, "select * from hallo");
oci_execute($stmt, OCI_DEFAULT);
echo "$connname ----selecting<br>\n";
while (oci_fetch($stmt)) {
echo " " . oci_result($stmt, "TEST") . "<br>\n";
}
echo "$connname ----done<br>\n";
}
create_table($c1);
insert_data('c1', $c1); // Вставить строку используя c1
sleep(2); // остановиться для записи другой временной метки для следующей строки
insert_data('c2', $c2); // Вставить строку используя c2
select_data('c1', $c1); // Возврат результата обоих вставок
select_data('c2', $c2); // Возврат результата обоих вставок
rollback('c1', $c1); // Откат используя c1
select_data('c1', $c1); // Откат был произведён для обоих вставок
select_data('c2', $c2);
drop_table($c1);
// Закрытие одного из соединений делает переменную PHP недоступной, но
// другие могут быть использованы
oci_close($c1);
echo "c1 is $c1<br>\n";
echo "c2 is $c2<br>\n";
// Вывод is:
// c1 is Resource id #5
// c2 is Resource id #5
// Created table
// c1 inserted row without committing
// c2 inserted row without committing
// c1 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c1 ----done
// c2 ----selecting
// 09-DEC-09 12:14:43
// 09-DEC-09 12:14:45
// c2 ----done
// c1 rollback
// c1 ----selecting
// c1 ----done
// c2 ----selecting
// c2 ----done
// Dropped table
// c1 is
// c2 is Resource id #5
?>
Замечание:
Некорректно установленный или настроенный модуль OCI8 будет часто сообщать о проблемах соединения или ошибках. Смотрите Установка/Настройка для решения проблем.