(PECL ibm_db2 >= 1.0.0)
db2_connect — Возвращает соединение с базой данных
$database,$username,$password,$options = []Функция создаёт новое соединение с базой данных IBM DB2 Universal Database, IBM Cloudscape или базой данных Apache Derby.
databasedatabase представляет собой псевдоним базы данных
в клиентском каталоге DB2.
Для некаталогизированного подключения к базе данных
параметр database представляет собой полную строку
подключения в следующем формате:
DATABASE=database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;
где параметры представляют следующие значения:Замечание:
При подключении к БД Db2 на ОС IBM i базовая система вызывает функцию » SQLDriverConnect, которая принимает только имя источника данных DSN, идентификатор пользователя UID и пароль PWD для » строки подключения. Вот так:
DSN=database;UID=username;PWD=password;
databasehostnameportusernamepasswordusernamenull
или пустую строку.
passwordnull
или пустую строку.
optionsАссоциативный массив параметров подключения, которые влияют на поведение подключения, в котором допустимые ключи массива включают:
autocommitDB2_AUTOCOMMIT_ON включает
автоматическую фиксацию (autocommit) для этого дескриптора соединения.
Передача значения DB2_AUTOCOMMIT_OFF выключает
автоматическую фиксацию (autocommit) для этого дескриптора соединения.
DB2_ATTR_CASEDB2_CASE_NATURAL указывает,
что имена столбцов возвращаются в естественном регистре.
Передача значения DB2_CASE_LOWER указывает,
что имена столбцов возвращаются в нижнем регистре.
Передача значения DB2_CASE_UPPER указывает,
что имена столбцов возвращаются в верхнем регистре.
CURSORDB2_FORWARD_ONLY задаёт курсор,
который двигается только вперёд, для ресурса оператора. Данный тип
курсора используется по умолчанию, он поддерживается всеми серверами
баз данных.
Передача значения DB2_SCROLLABLE задаёт
прокручиваемый курсор для ресурса оператора. Этот режим включает
произвольный доступ к строкам в наборе результатов, но в настоящее
время поддерживается только IBM DB2 Universal Database.
Эта новая опция доступна в модуле ibm_db2 версии 1.7.0 и новее.
trustedcontextdb2 catalog tcpip node loopback remote <SERVERNAME> server <SERVICENAME> db2 catalog database <LOCALDBNAME> as <REMOTEDBNAME> at node loopback db2 "update dbm cfg using svcename <SERVICENAME>" db2set DB2COMM=TCPIP
Эти новые опции ОС i5/OS доступны в модуле ibm_db2 версии 1.5.1 и новее.
i5_libi5_namingDB2_I5_NAMING_ON включает режим
именования системы DB2 UDB CLI iSeries. Файлы квалифицируются
через слеш (/) в качестве разделителя. Неквалифицированные
файлы разрешаются с использованием списка библиотек для работы.
Значение DB2_I5_NAMING_OFF выключает режим
именования по умолчанию DB2 UDB CLI, который представляет собой именование SQL.
Файлы квалифицируются через точку (.) в качестве
разделителя. Неквалифицированные файлы разрешаются с использованием
либо библиотеки по умолчанию, либо текущего идентификатора
пользователя.
i5_commit
Атрибут i5_commit требуется установить перед
вызовом функции db2_connect(). Если значение изменяется
после установки соединения, и соединение установлено
с удалённым источником данных, изменение не вступит в силу до
следующего успешного вызова функции db2_connect()
для дескриптора соединения.
Замечание: Параметр
ibm_db2.i5_allow_commit==0 файла php.ini или настройкаDB2_I5_TXN_NO_COMMITиспользуется по умолчанию, но может быть изменён через параметрi5_commit.
DB2_I5_TXN_NO_COMMIT — Контроль транзакций не
используется.
DB2_I5_TXN_READ_UNCOMMITTED — Возможны грязные
чтения, неповторяющиеся чтения и фантомы.
DB2_I5_TXN_READ_COMMITTED — Грязное чтение невозможно.
Возможны неповторяющиеся чтения и фантомы
DB2_I5_TXN_REPEATABLE_READ — Грязные чтения и
неповторяющиеся чтения невозможны. Возможны фантомы.
DB2_I5_TXN_SERIALIZABLE — Транзакции сериализуемы.
Грязные чтения, неповторяющиеся чтения и фантомы невозможны.
i5_query_optimizeDB2_FIRST_IO — Все запросы оптимизированы с целью
максимально быстрого возврата первой страницы вывода. Эта цель
хорошо работает, когда вывод контролируется пользователем, который,
скорее всего, отменит запрос после просмотра первой страницы
выходных данных. Запросы, закодированные с предложением
OPTIMIZE FOR nnn ROWS, учитывают цель, указанную в предложении.
DB2_ALL_IO — Все запросы оптимизированы с целью
выполнить весь запрос до завершения в кратчайшие сроки. Это хороший
вариант, когда выходные данные запроса записываются в файл или отчёт,
или когда интерфейс ставит выходные данные в очередь. Запросы,
закодированные с предложением OPTIMIZE FOR nnn ROWS, учитывают цель,
указанную в предложении. Это значение по умолчанию.
i5_dbcs_allocDB2_I5_DBCS_ALLOC_ON включает схему
распределения DB2 6X для увеличения размера столбца преобразования DBCS.
Значение DB2_I5_DBCS_ALLOC_OFF отключает схему
распределения DB2 6X для увеличения размера столбца преобразования DBCS.
Замечание: параметр ibm_db2.i5_dbcs_alloc==0 файла php.ini
или параметр DB2_I5_DBCS_ALLOC_OFF — значение
по умолчанию, но его можно изменить через параметр
i5_dbcs_alloc.
i5_date_fmtDB2_I5_FMT_ISO — Используется формат даты
Международной организации по стандартизации ISO (yyyy-mm-dd).
Это значение по умолчанию.
DB2_I5_FMT_USA — Используется формат даты США
(mm/dd/yyyy).
DB2_I5_FMT_EUR — Используется европейский формат
даты (dd.mm.yyyy).
DB2_I5_FMT_JIS — Используется формат даты японского
промышленного стандарта (yyyy-mm-dd).
DB2_I5_FMT_MDY — Используется формат даты
mm/dd/yyyy.
DB2_I5_FMT_DMY — Используется формат даты
dd/mm/yyyy.
DB2_I5_FMT_YMD — Используется формат даты yy/mm/dd.
DB2_I5_FMT_JUL — Используется юлианский формат
даты (yy/ddd).
DB2_I5_FMT_JOB — Используется задание по умолчанию.
i5_date_sepDB2_I5_SEP_SLASH — В качестве разделителя даты
используется косая черта ( / ). Это значение по умолчанию.
DB2_I5_SEP_DASH — В качестве разделителя даты
используется дефис ( - ).
DB2_I5_SEP_PERIOD — В качестве разделителя даты
используется точка ( . ).
DB2_I5_SEP_COMMA — В качестве разделителя даты
используется запятая ( , ).
DB2_I5_SEP_BLANK — В качестве разделителя даты
используется пробел.
DB2_I5_SEP_JOB — Используется задание по умолчанию.
i5_time_fmtDB2_I5_FMT_ISO — Используется формат времени
Международной организации по стандартизации ISO (hh.mm.ss). Это
значение по умолчанию.
DB2_I5_FMT_USA — Используется формат времени США
(hh:mmxx, где xx — обозначение AM или PM).
DB2_I5_FMT_EUR — Используется европейский формат
времени (hh.mm.ss).
DB2_I5_FMT_JIS — Используется японский промышленный
стандартный формат времени (hh:mm:ss).
DB2_I5_FMT_HMS — Используется формат hh:mm:ss.
i5_time_sepDB2_I5_SEP_COLON — В качестве разделителя
времени используется двоеточие ( : ). Это значение по умолчанию.
DB2_I5_SEP_PERIOD — В качестве разделителя
времени используется точка ( . ).
DB2_I5_SEP_COMMA — В качестве разделителя
времени используется запятая ( , ).
DB2_I5_SEP_BLANK — В качестве разделителя времени
используется пробел.
DB2_I5_SEP_JOB — Используется задание по умолчанию.
i5_decimal_sepDB2_I5_SEP_PERIOD — В качестве десятичного
разделителя используется точка ( . ). Это значение по умолчанию.
DB2_I5_SEP_COMMA — В качестве десятичного
разделителя используется запятая ( , ).
DB2_I5_SEP_JOB — Используется задание по умолчанию.
Данная новая опция ОС i5/OS доступна в модуле ibm_db2 версии 1.8.0 и новее.
i5_liblЗамечание: Параметр
i5_liblвызывает qsys2/qcmdexc('cmd',cmdlen), который доступен только в ОС i5/OS V5R4 и новее.
Функция возвращает ресурс дескриптора подключения, если попытка подключения успешна.
Функция db2_connect() возвращает false , елси возникла ошибка подключения.
Пример #1 Пример создания каталогизированного соединения
Каталогизированные соединения требуют, предварительной каталогизации базы данных через Command Line Processor (CLP) или Configuration Assistant базы данных DB2.
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$conn = db2_connect($database, $user, $password);
if ($conn) {
echo "Соединение установлено.";
db2_close($conn);
} else {
echo "Не удалось установить соединение.";
}
?>Результат выполнения приведённого примера:
Соединение установлено.
Пример #2 Пример создания некаталогизированного соединения
Некаталогизированное соединение разрешает динамически подключаться к базе данных.
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$hostname = 'localhost';
$port = 50000;
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
"HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;"
;
$conn = db2_connect($conn_string, '', '');
if ($conn) {
echo "Соединение установлено.";
db2_close($conn);
} else {
echo "Не удалось установить соединение.";
}
?>Результат выполнения приведённого примера:
Соединение установлено.
Пример #3 Пример создания соединения с отключённой автофиксацией по умолчанию
Передача массива параметров в функцию db2_connect() разрешает изменять поведение дескриптора соединения по умолчанию.
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF);
$conn = db2_connect($database, $user, $password, $options);
if ($conn) {
echo "Соединение установлено.\n";
if (db2_autocommit($conn)) {
echo "Автофиксация включена.\n";
} else {
echo "Автофиксация выключена.\n";
}
db2_close($conn);
} else {
echo "Не удалось установить соединение.";
}
?>Результат выполнения приведённого примера:
Соединение установлено. Автофиксация выключена.
Пример #4 Лучшая производительность ОС i5/OS
Чтобы добиться максимальной производительности PHP-приложения, которое работает с модулем ibm_db2 1.5.1 операционной системы i5/OS, указывают хост по умолчанию, идентификатор пользователя и пароль для функции db2_connect().
<?php
$library = "ADC";
$i5 = db2_connect("", "", "", array("i5_lib" => "qsys2"));
$result = db2_exec(
$i5,
"SELECT * FROM systables WHERE table_schema = '$library'"
);
while ($row = db2_fetch_both($result)) {
echo $row['TABLE_NAME'] . "<br>";
}
db2_close($i5);
?>Результат выполнения приведённого примера:
ANIMALS NAMES PICTURES
Пример #5 Пример работы с доверенным контекстом
Пример показывает, как включить доверенный контекст, переключить пользователей и получить текущий идентификатор пользователя.
<?php
$database = "SAMPLE";
$hostname = "localhost";
$port = 50000;
$authID = "db2inst1";
$auth_pass = "ibmdb2";
$tc_user = "tcuser";
$tc_pass = "tcpassword";
$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;"
. "PROTOCOL=TCPIP;UID=$authID;PWD=$auth_pass;";
$options = array("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);
$tc_conn = db2_connect($dsn, "", "", $options);
if ($tc_conn) {
echo "Явное доверенное соединение установлено.\n";
if (db2_get_option($tc_conn, "trustedcontext")) {
$userBefore = db2_get_option($tc_conn, "trusted_user");
// Выполнение работы в качестве пользователя с идентификатором 1
// Переключение на доверенного пользователя
$parameters = array(
"trusted_user" => $tc_user,
"trusted_password" => $tcuser_pass
);
$res = db2_set_option($tc_conn, $parameters, 1);
$userAfter = db2_get_option($tc_conn, "trusted_user");
// Продолжение выполнения работы в качестве доверенного пользователя
if ($userBefore != $userAfter) {
echo "Пользователь был переключён." . "\n";
}
}
db2_close($tc_conn);
} else {
echo "Не удалось установить явное доверенное соединение.\n";
}
?>Результат выполнения приведённого примера:
Явное доверенное соединение установлено. Пользователь был переключён.
As of 09/29/2015 when using the ibm_db2 driver and specifying an invalid library list with the 'i5_libl' option, the connection will be successfully created but with a default library list. What happens is the connection is made and THEN the library list is attempted to be changed. The connection will be a success but the library list change will fail without "db2_conn_error()" or "db2_conn_errormsg()" reporting anything and a default library list will be used. However, "db2_stmt_error()" and "db2_stmt_errormsg()" will register with a value. Also if error reporting is enable, the warning will be output to the screen. This is not a bug, rather intended behavior according to Zend (I opened a ticked) and depending on which library list is used/swapped could lead to major problems (development VS production). I stumbled upon this behavior when an anomaly (which I still can't explain) was imploding my library list with the character 'Z'. I realized I was in my development environment but accessing production data as a result. Going forward I will make sure to add this additional check for good measure.
See below to recreate behavior:
<?php
ini_set("display_errors", 1);
$systemName = 'systemName';
$userID = 'userName';
$password = 'password';
$options['i5_libl'] = implode('Z', array(
'INVALID',
'LIB',
'LIST',
'IMPLODED',
'WITH',
'THE',
'LETTER',
'Z'
));
$options['i5_naming'] = DB2_I5_NAMING_ON;
$conn = db2_connect($systemName, $userID, $password, $options);
//This line causes "ini_set("display_errors", 1)" to dislay this warning on the screen:
//Warning: db2_connect(): Statement Execute Failed in /PATH/TO/FILE/test.php on line 58
if (db2_stmt_error()) { //Evaluates to true
echo "error ID: " . (db2_stmt_error()); //Displays error code: 38501
echo "<br>error message: " . (db2_stmt_errormsg()); //Displays: Trigger program or external routine detected an error. SQLCODE=-443
}
echo "<br />|".db2_conn_error()." ||| ".db2_conn_errormsg()."|<br />"; //Only "| ||| |" is displayed
print_r($conn); //A resource ID is displayed
echo "<br />";
if(isset($conn) && $conn === true){
echo "Boolean true<br />";
//never executes, but not expected since either false or a resource ID should be returned.
//Plus it is clear $conn contains a resource ID from above.
}
if(isset($conn) && $conn == true){
echo "Non-Boolean true 2<br />";
//This always executes regardless of an accurate library list or not
//I suppose "if($conn)" would evaluate to non-boolean true so this makes sense.
}
if(isset($conn) && $conn == "true"){
echo "String true";
//Never executes, but not expected.
}
if(isset($conn) && $conn === false){
echo "Boolean false<br />";
//never executes because the connection itself was a success.
//If invalid credentials were provided this executes.
}
if(isset($conn) && $conn == false){
echo "Non-Boolean false 2<br />";
//never executes because the connection itself was a success.
//Added this here because I was unsure if a boolean false would be returned or not.
//If invalid credentials were provided this executes as well.
}
if(isset($conn) && $conn == "false"){
echo "String false";
//never executes because the connection itself was a success.
//Added this here because I was unsure if a String "false" would be returned
}
?>